[^][]是一个字符类,表示除
[和以外的所有字符
]。
您可以避免转义
[和
]特殊字符,因为它对于PCRE(
preg_函数中使用的正则表达式引擎)不是模棱两可的。
由于
[^]在PCRE中不正确,因此正则表达式解析的唯一方法
]是在字符类内部,该字符类稍后将关闭。与
[以下相同。它不能重新打开字符类内的字符类(POSIX字符类除外
[:alnum:])。然后最后一个
]清楚了。它是角色类的结尾。但是,
[字符类外部的字符必须转义,因为它被解析为字符类的开始。
以同样的方式,你可以写
[]]或者
[[]或
[^[]不逃离
[或
]在字符类。
注意:自PHP
7.3起,您可以使用内联xx修饰符,该修饰符甚至在字符类内部也可以忽略空白字符。这样,您就可以在那样的少ambigous方式编写这些类:
(?xx) [^][ ] [ ] ] [ [ ] [^ [ ]。
您可以将此语法与几种正则表达式结合使用:PCRE(PHP,R),Perl,Python,Java,.NET,GO,awk,Tcl(
如果使用大括号分隔模式,请感谢Donal Fellows ),…
但不适用于:Ruby,Javascript( IE <9除外),…
正如m.buettner所指出的那样,
[^]]它不是模棱两可的,因为它
]是第 一个 字符,
[^a]]被视为
_不是
a后跟一个的所有
]_字符。要拥有
a和
],您必须输入:
[^a]]或
[^]a]
在Javascript的特殊情况下,该规范允许
[]作为 永不 匹配的regex令牌(换句话说,
[]将始终失败)和
[^]匹配 任何字符
的regex 。然后
[^]]视为 任何字符,后跟一个
]。实际的实现方式有所不同,但是现代浏览器通常会遵循规范中的定义。
图案细节:
[ # 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)[^][]*)*+])避免了交替的费用。


![“ [^] []”正则表达式是什么意思? “ [^] []”正则表达式是什么意思?](http://www.mshxw.com/aiimages/31/412015.png)
