什么是“ ”正则expression式?

我发现它在下面的正则expression式:

\[(?:[^][]|(?R))*\] 

它将方括号(及其内容)与嵌套的方括号一起匹配。

[^][]是一个字符类,意思是除[]之外的所有字符。

您可以避免转义[]特殊字符,因为它对preg_函数中使用的正则expression式引擎PCRE没有歧义。

由于[^]在PCRE中不正确,因此正则expression式parsing的唯一方法是在后面将要closures的字符类中。 跟[后面的]一样。 它不能在字符类中重新打开字符类(除了POSIX字符类[:alnum:] )。 那么最后]是清楚的; 这是angular色类的结尾。 但是, [字符类外部必须被转义,因为它被parsing为字符类的开始。

以同样的方式,你可以写[]][[][^[]而不用转义字符类中的[]

你可以使用这个语法的几个正则expression式:PCRE(PHP,R),Perl,Python,Java,.NET,GO,awk,Tcl( 如果你用花括号划定你的模式,谢谢Donal Fellows ),…

但不是与:Ruby,JavaScript( 除IE <9 ),…

正如m.buettner指出的那样, [^]]不是含糊不清的,因为]是第一个字符, [^a]]被看作是不是a后面跟着的] 。 要有a] ,你必须写: [^a\]][^]a]

在JavaScript的特殊情况下,规范允许[]作为永不匹配的正则expression式标记(换句话说, []将总是失败), [^]作为匹配任何字符的正则expression式。 然后[^]]被视为任何字符后跟一个] 。 实际的实现各不相同,但现代浏览器一般都坚持规范中的定义。

图案细节:

 \[ # literal [ (?: # open a non capturing group [^][] # a character that is not a ] or a [ | # OR (?R) # the whole pattern (here is the recursion) )* # repeat zero or more time \] # a literal ] 

在你的模式例子中,你不需要逃避最后一个]

但是你可以用这个模式做一点点优化,并且更有用的原因是可重用的子模式(使用(?-1)(\[(?:[^][]+|(?-1))*+])

 ( # open the capturing group \[ # a literal [ (?: # open a non-capturing group [^][]+ # all characters but ] or [ one or more time | # OR (?-1) # the last opened capturing group (recursion) # (the capture group where you are) )*+ # repeat the group zero or more time (possessive) ] # literal ] (no need to escape) ) # close the capturing group 

或者更好: (\[[^][]*(?:(?-1)[^][]*)*+]) ,避免了交替的代价。