“ [^] []”正则表达式是什么意思?

我在以下正则表达式中找到了它:

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

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

回答:

[^][]是一个字符类,表示除[和以外的所有字符]

您可以避免转义[]特殊字符,因为它对于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)[^][]*)*+])避免了交替的费用。

以上是 “ [^] []”正则表达式是什么意思? 的全部内容, 来源链接: utcz.com/qa/427994.html

回到顶部