什么是“;[^][]”;正则表达式平均值


What does the "[^][]" regex mean?

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

'[(?:[^][]|(?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,其避免了替换的成本。