什么是“ ”正则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)[^][]*)*+])
,避免了交替的代价。