正则表达式 - 数字括号问题

时间:2015-12-15 08:45:19

标签: php regex

我有一个很大的麻烦,允许这个正则表达式:

                               {{{ hello{{there}} }}}

我的问题主要是区分双括号和三括号,因为符号使用braket ......我试过了

\{{2}           /*Accept only two brakets --- Does NOT work*/

允许2个制动器,但它根本不起作用。

正则表达专家可以告诉我一招吗?提前致谢

1 个答案:

答案 0 :(得分:3)

要区分三重和双重大括号,您需要使用 lookarounds

要仅匹配开口大括号,请使用

(?<!{){{2}(?!{)

此处,(?<!{)是一个负面的背后隐藏,确保在第一个{{之前没有(?!{) 否定前瞻确保在第二个{之后没有{。请参阅regex demo here

要仅匹配三个开口大括号,请使用

(?<!{){{3}(?!{)

请参阅another regex demo

只需在上述所有表达式中使用}即可匹配结束括号。

请注意,在PHP正则表达式中无需转义{},引擎足够聪明,知道它们不属于限制量词。

要获取{{{}}} 之间的所有子字符串,您可以使用

'~(?<!{){{{(?!{)\s*(.*?)\s*(?<!})}}}(?!})~s'

请参阅3rd regex demoPHP code

$re = '~(?<!{){{{(?!{)\s*(.*?)\s*(?<!})}}}(?!})~s'; 
$str = "{{{ hello{{there}} }}} {{{good {{morning}} }}}"; 
preg_match_all($re, $str, $matches);
print_r($matches[1]);

输出:

[0] => hello{{there}}
[1] => good {{morning}}

另请注意,如果您没有四倍{} s,则可以省略外观并使用'~{{{\s*(.*?)\s*}}}~s'