正则表达式的乐趣 - 找到一些但跳过其他人

时间:2015-10-29 18:13:30

标签: javascript regex

正则表达式有一些真正的麻烦。令人震惊的。

目标:当且仅当内部存在[[和/或]]时才匹配{{through}}。

鉴于以下示例,我希望匹配所有内容,但 {{three}}(以及一,二,四,六,八,十三和十六)

我目前的正则表达式的英文翻译是:“在左括号之后给我一切,后跟一个空格或单词后面跟两个左括号”。

我认为我已经超越了前瞻。

"One two {{three}} four {{ [[five]]}} six {{[[seven]]}} eight {{ Nine: [[ten]] }} {{Eleven: [[twelve]]}} thirteen {{Fourteen: [[fifteen]] }} sixteen"
.match(/\{{2}(?=(\s|\w(?=\[{2}))).{7}/g);

。{7}是这样我可以简单地看到我在控制台中的结果。

我正在寻找的结果是:

["{{ [[five]]}}", "{{[[seven]]}}", "{{ Nine: [[ten]] }}", "{{Eleven: [[twelve]]}}", "{{Fourteen: [[fifteen]] }}"]

请帮助一个家伙。

谢谢!

1 个答案:

答案 0 :(得分:1)

你需要的正则表达式是:

/\{\{(?=(?:(?!\}\}).)*(?:\[\[|\]\])).*?\}\}/g

示例代码:

var str ="One two {{three}} four {{ [[five]]}} six {{[[seven]]}} eight {{ Nine: [[ten]] }} {{Eleven: [[twelve]]}} thirteen {{Fourteen: [[fifteen]] }} sixteen",
    regex = /\{\{(?=(?:(?!\}\}).)*(?:\[\[|\]\])).*?\}\}/g;
str.match(regex); // result: ["{{ [[five]]}}", "{{[[seven]]}}", "{{ Nine: [[ten]] }}", "{{Eleven: [[twelve]]}}", "{{Fourteen: [[fifteen]] }}"]

Demo

这可以通过以下方式工作:

  • /启动正则表达式
  • \{\{匹配{{
  • (?=向前看
    • (?:非匹配组启动
      • (?!\}\})不匹配}}
      • .任何角色
    • )不匹配的小组结束
    • *重复该非匹配组零次或多次
    • (?:非匹配组启动
      • \[\[|\]\] [[]]
    • )不匹配的小组结束
  • ) lookahead end
  • .*?零个或多个字符,非贪婪
  • \}\}匹配}}
  • /正则表达式结束
  • g全球匹配标志

换句话说,它会查找{{后跟零个或多个不是}},然后是[[]]的字符,然后是0或更多字符,然后}}