正则表达式有一些真正的麻烦。令人震惊的。
目标:当且仅当内部存在[[和/或]]时才匹配{{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]] }}"]
请帮助一个家伙。
谢谢!
答案 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]] }}"]
这可以通过以下方式工作:
/
启动正则表达式\{\{
匹配{{
(?=
向前看
(?:
非匹配组启动
(?!\}\})
不匹配}}
.
任何角色)
不匹配的小组结束*
重复该非匹配组零次或多次(?:
非匹配组启动
\[\[|\]\]
[[
或]]
)
不匹配的小组结束)
lookahead end .*?
零个或多个字符,非贪婪\}\}
匹配}}
/
正则表达式结束g
全球匹配标志换句话说,它会查找{{
后跟零个或多个不是}}
,然后是[[
或]]
的字符,然后是0或更多字符,然后}}
。