我在以下正则表达式中找到了它:
'[(?:[^][]|(?R))*']
它将方括号(及其内容)与嵌套的方括号匹配在一起。
[^][]
是一个字符类,表示除[
和]
之外的所有字符。
您可以避免转义[
和]
特殊字符,因为它对PCRE(preg_
函数中使用的正则表达式引擎)没有歧义。
由于[^]
在PCRE中不正确,正则表达式解析的唯一方法是]
位于稍后将关闭的字符类中。与下面的[
相同。它不能在字符类中重新打开字符类(POSIX字符类[:alnum:]
除外)。则最后一个CCD_ 11被清除;这是字符类的结束。但是,字符类之外的[
必须转义,因为它被解析为字符类的开头。
同样,您可以编写[]]
、[[]
或[^[]
,而无需转义字符类中的[
或]
。
注意:从PHP7.3开始,您可以使用内联xx修饰符,即使在字符类中也可以忽略空白字符。通过这种方式,您可以用一种不那么模糊的方式来编写这些类:(?xx) [^ ][ ] [ ] ] [ [ ] [^ [ ]
。
您可以将此语法与几种regex风格一起使用:PCRE(PHP,R)、Perl、Python、Java、.NET、GO、awk、Tcl(如果您用花括号分隔模式,请感谢Donal Fellows)。。。
但不包括:Ruby,JavaScript(,IE<9除外)。。。
正如m.buettner所指出的,[^]]
并不含糊,因为]
是第一个字符,[^a]]
被视为所有不是a
后面跟着]
的字符。要获得a
和]
,必须写入:[^a']]
或[^]a]
在JavaScript的特殊情况下,规范允许[]
作为从不匹配的正则表达式标记(换句话说,[]
将始终失败),[^]
作为匹配任何字符的正则表达式。则[^]]
被视为后面跟有]
的任何字符。实际的实现方式各不相同,但现代浏览器通常坚持规范中的定义。
图案详细信息:
'[ # 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
或者更好:CCD_ 36,其避免了替换的成本。