假设我有一个类似的字符串:
"lets refer to [[merp] [that entry called merp]] and maybe also to that entry called [[blue] [blue]]"
这里的想法是用[[name][some text]]
替换<a href="name.html">some text</a>
块。
所以我试图使用正则表达式来查找看起来像[[name][some text]]
的块,但我遇到了极大的困难。
这是我认为应该工作的(在PHP中):
preg_match_all('/\[\[.*\]\[.*\]/', $my_big_string, $matches)
但这只会返回一个匹配项,即'[[merp'
到'blue]]'
的字符串。如何让它返回两个匹配[[merp][that entry called merp]]
和[[blue][blue]]
?
答案 0 :(得分:4)
您正在寻找的正则表达式为\[\[(.+?)\]\s\[(.+?)\]\]
,并将其替换为<a href="$1">$2</a>
在()
括号内匹配的正则表达式模式被捕获,可以使用$ 1,$ 2,...进行反向引用。
答案 1 :(得分:2)
Quantifiers,*
默认为greedy,
这意味着,尽可能匹配满足条件。例如。在您的示例中,\[.*\]
等正则表达式将匹配字符串中第一个[
到最后一个]
的所有内容。要更改默认行为并使量词 lazy ( ungreedy,reluctant ):
U (PCRE_UNGREEDY)
modifier使所有量词变得懒惰?
。例如。 .*?
尽可能少的任何角色1。)使用U - modifier模式看起来像:
/\[\[(.*)]\s*\[(.*)]]/Us
其他使用s(PCRE_DOTALL)modifier使.
点也匹配换行符。并在示例字符串中的\s
之间添加了一些][
个空格。 \s
是[ \t\r\n\f]
的{{3}}。
然后要替换两个捕获组(.*)
。 shorthand
2。)而是使用?
使每个量词变得懒惰:
/\[\[(.*?)]\s*\[(.*?)]]/s
3。)如果预期在[...]
内没有方括号,则不带修饰语。
/\[\[([^]]*)]\s*\[([^]]*)]]/
使用^
否定Test on regex101.com允许[^]]*
任意数量的字符,在]
和[
之间不是]
。这不需要依赖贪婪。此外,不使用.
,因此不需要s-modifier。
根据您的示例替换所有3个示例:<a href="\1">\2</a>
其中\1
对应第一个Test on regex101.com的匹配项,...