0

我要匹配的模式是[{Any text between here}]

我的正则表达式:

/\[\{[\W\w]*?\}\]/

我在用preg_match_all()

到目前为止它正在工作,但我想知道是否有更好的解决方案?

4

4 回答 4

2

如果要查找包含的匹配项,[{然后}]使用

/\[\{[^}]+\}\]/

如果您只想在文本内匹配,请使用

/(?<=\[\{)[^}]+(?=\}\])/

如果里面的文本可能包含}字符(例如[{hello}yellow}] ),则在上述两种正则表达式模式中替换[^}]+为。.+?原始模式具有更好的性能,因为它们没有使用惰性运算符?

于 2012-07-04T13:56:43.587 回答
2

您可以将其简化为

\[\{.*?\}\]

甚至

\[{.*?}]

但除此之外,它看起来还不错。


编辑

请注意,虽然正则表达式执行所需的操作,但由于使用了惰性运算符,因此性能不是最佳的。

当通过 RegexBuddy 之类的工具查看时,这个正则表达式需要21 个步骤才能得出一个解决方案,而 @Ωmega 的解决方案只需要5 个步骤

于 2012-07-04T13:57:56.813 回答
1

使用这个正则表达式(?<=\[\{)(.+?)(?=\}\])

于 2012-07-04T13:55:58.590 回答
1

键“U”使正则表达式引擎不贪心:

preg_match_all('_\[{.*}\]_U', '[{safda}adsfsf}}][{safda}adsfsf}}]', &$matches);

给出 $matches

Array
(
    [0] => Array
        (
            [0] => [{safda}adsfsf}}]
            [1] => [{safda}adsfsf}}]
        )

)
于 2012-07-04T13:59:01.757 回答