我要匹配的模式是[{Any text between here}]
我的正则表达式:
/\[\{[\W\w]*?\}\]/
我在用preg_match_all()
到目前为止它正在工作,但我想知道是否有更好的解决方案?
如果要查找包含的匹配项,[{
然后}]
使用
/\[\{[^}]+\}\]/
如果您只想在文本内匹配,请使用
/(?<=\[\{)[^}]+(?=\}\])/
如果里面的文本可能包含}
字符(例如[{hello}yellow}] ),则在上述两种正则表达式模式中替换[^}]+
为。.+?
原始模式具有更好的性能,因为它们没有使用惰性运算符?
。
您可以将其简化为
\[\{.*?\}\]
甚至
\[{.*?}]
但除此之外,它看起来还不错。
编辑
请注意,虽然正则表达式执行所需的操作,但由于使用了惰性运算符,因此性能不是最佳的。
当通过 RegexBuddy 之类的工具查看时,这个正则表达式需要21 个步骤才能得出一个解决方案,而 @Ωmega 的解决方案只需要5 个步骤。
使用这个正则表达式(?<=\[\{)(.+?)(?=\}\])
键“U”使正则表达式引擎不贪心:
preg_match_all('_\[{.*}\]_U', '[{safda}adsfsf}}][{safda}adsfsf}}]', &$matches);
给出 $matches
:
Array
(
[0] => Array
(
[0] => [{safda}adsfsf}}]
[1] => [{safda}adsfsf}}]
)
)