如何在没有令牌的情况下匹配两个令牌之间的字符串

时间:2016-02-20 22:50:09

标签: javascript regex string

我有一个段落,我想从中提取字符串,用双方括号"[[" ... "]]"包围。括号内的一些字符串包含一个条形|我想省略那些。我创建了以下正则表达式\[\[([^|]+?)\]\]/g这个正则表达式完美无缺,然而它返回带有周围方括号的字符串。有类似的问题通过使用str.split来解决这个问题,但我匹配了200多个字符串,这可能会减少性能,因此我只想要正则表达式的答案。

编辑 - 忘记提及这是一个非常长的段落,我需要所有匹配因此我指定/ g标志以获取所有匹配的数组。

1 个答案:

答案 0 :(得分:4)

你的正则表达式看起来很好。我想你只是在看结果的错误部分。当你得到一个匹配时,Regex.exec()返回一个数组。索引0包含完整匹配,例如"[[value]]",后面的索引包含parantheses中的每个子匹配,例如"value"。所以,只需查看match[1]而不是match[0]

要处理多个匹配项,请添加g标志,并使用while循环多次运行Regex.exec() - 这将为每个连续匹配返回结果数组,直到不再匹配为止找到并返回null。您可以将每个结果推送到一个数组中。你的正则表达式仍然是相同的。



var inputs = [
  "foo [[value]] bar",
  "foo [[val1|val2]] bar",
  "foo [[value1]] bar [[value|2]] fizz [[value3]] buzz",
];

console.clear();
for(var i = 0; i < inputs.length; i++) {

  var re = /\[\[([^|]+?)\]\]/g;
  var match;
  var matches = [];
  while((match = re.exec(inputs[i])) !== null) {
      matches.push(match[1]);
  }

  console.log(inputs[i]);
  console.log(matches);
}
&#13;
&#13;
&#13;