当前位置: 首页 > 面试题库 >

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

沙柏
2023-03-14
问题内容

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

\[(?:[^][]|(?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)[^][]*)*+])避免了交替的费用。



 类似资料: