将字符串拆分为 javascript 中的匹配组和非匹配组

Splitting string into matching and non-matching groups in javascript

我正在尝试将字符串拆分为一个字符串数组,这些字符串与正则表达式匹配,而那些不匹配:

string = "Lazy {{some_animal}} jumps over.."
# do some magic with regex /({{\s?[\w]+\s?}})/g and its negation
array = ["Lazy ", "{{some_animal}}", " jumps over.."]

在 javascript?

中执行此操作的最佳性能方式

我相当确定一个简单的 exec 循环将是您的最佳选择:

function getSegments(rex, str) {
  var segments = [];
  var lastIndex = 0;
  var match;
  rex.lastIndex = 0; // In case there's a dangling previous search
  while (match = rex.exec(str)) {
    if (match.index > lastIndex) {
      segments.push(str.substring(lastIndex, match.index));
    }
    segments.push(match[0]);
    lastIndex = match.index + match[0].length;
  }
  if (lastIndex < str.length) {
    segments.push(str.substring(lastIndex));
  }
  return segments;
}

var rex = /{{\s?[\w]+\s?}}/g;
var string = "Lazy {{some_animal}} jumps over..";

console.log(getSegments(/{{\s?[\w]+\s?}}/g, string));

注意我删除了捕获组;这种解决方案不需要它。

你可以使用 String match

下面的正则表达式只匹配任何不是胡须的东西,可选地被胡须包围。

示例片段:

var str = "Lazy {{some_animal}} jumps over..";

const pattern = /\{*[^{}]+\}*/g;

var array = str.match(pattern);

console.log(str);
console.log(pattern);
console.log(array);

但为了更精确,正则表达式模式变得有点复杂。
下面的正则表达式匹配:

  1. "what you want"
    (每边2个胡须之间的一个字)
  2. 或"what you don't want followed by what you want"
    (使用惰性匹配和积极的前瞻)
  3. 或"what remains"

var str = "Lazy {{some_animal}} jumps over..";

const pattern = /\{\{\w+\}\}|.+?(?=\{\{\w+\}\})|.+/g;

var array = str.match(pattern);

console.log(str);
console.log(pattern);
console.log(array);

最后但同样重要的是,邪恶的 SM 方法。
在同一个正则表达式上拆分和匹配。并将它们连接成一个数组。
这种方法的缺点是不保留顺序。

var str = "Lazy {{some_animal}} jumps over..";

const pattern = /\{\{\w+\}\}/g;

var what_you_want = str.match(pattern);
var what_you_dont_want = str.split(pattern);

var array = what_you_want.concat(what_you_dont_want);

console.log(str);
console.log(pattern);
console.log(array);