【问题标题】:What does the "?:^" regular expression mean?“?:^”正则表达式是什么意思?
【发布时间】:2009-03-02 16:52:55
【问题描述】:

我正在查看这个子表达式(这是在 JavaScript 中):

(?:^|.....)

我知道 ? 当它跟在一个字符后面时表示“零次或一次”,但不确定在这种情况下它是什么意思。

【问题讨论】:

  • 看起来像一个矛盾的猫王,带着蓬蓬…… :p :D

标签: javascript regex


【解决方案1】:

在使用组时,您通常有几个选项可以修改组的行为:

(foo)     // default behavior, matches "foo" and stores a back-reference
(?:foo)   // non-capturing group: matches "foo", but doesn't store a back-ref
(?i:foo)  // matches "foo" case-insensitively
(?=foo)   // matches "foo", but does not advance the current position
          // ("positive zero-width look-ahead assertion")
(?!foo)   // matches anything but "foo", and does not advance the position 
          // ("negative zero-width look-ahead assertion")

仅举几例。

它们都以“?”开头,这是表示组修饰符的方式。在这种情况下,问号与可选性无关。

它只是说:

(?:^foo)  // match "foo" at the start of the line, but do not store a back-ref

有时,存储对您无论如何都不会使用的匹配部分的反向引用只是矫枉过正。当组只是为了使复杂的表达式原子化(例如,它应该作为一个整体匹配或失败),存储反向引用是不必要的资源浪费,甚至可能会减慢正则表达式的速度。有时,您只想成为第 1 组与您相关的第一个组,而不是 正则表达式中的第一个组

【讨论】:

  • 这非常有用。谢谢。
【解决方案2】:

您可能在这种情况下看到它

(?:...)

这意味着该组不会被捕获或用于反向引用。

编辑:反映您修改后的问题:

(?:^|....)

表示“匹配行首或匹配...”,但不要捕获组或将其用于反向引用。

【讨论】:

  • 插入符号不是反向引用表达式的一部分。
  • @cynoclast:没错,但在回答时它是问题的一部分(问题已被修改)
  • 非常好 - 谢谢。不幸的是,由于使用的字符,RegEx 是出了名的不适合谷歌搜索:)
【解决方案3】:

(?:some stuff) 表示您不想单独匹配括号中的表达式。通常,括号中分组的正则表达式的各个部分是分组的,可以单独引用(这称为使用反向引用)。

http://www.regular-expressions.info/brackets.html

【讨论】:

    【解决方案4】:

    简答

    它将(括号中的)组标记为non-capturing 组。

    关于这个特定表达式的详细信息

    非捕获组的表示法是:

    (?:<expresson>)
    

    在您提供的实例中,插入符号 (^) 是表达式的一部分,而不是捕获组符号的一部分。而且这个实例也不是特殊字符。

    看起来他们正在使用带有插入符号的“或”运算符(管道)。因此,他们希望匹配插入符号或管道右侧的任何内容,但不将表达式捕获为一个组(通过分组字符开头的?: 完成。

    一般

    非捕获组允许您以不是back-refernceable 的方式对表达式进行分组,并且还会提高表达式的性能。

    【讨论】:

      【解决方案5】:

      【讨论】:

        【解决方案6】:

        ?:一般表示将该组设为非捕获。你可以做一些研究here

        我几乎肯定任何正则表达式引擎都应该,但是当我在引擎之间切换时,我遇到了一些怪癖。

        编辑:应该是这样,非捕获似乎工作正常。

        【讨论】:

          猜你喜欢
          • 2012-06-10
          • 2011-08-28
          • 1970-01-01
          • 2011-06-15
          • 2012-05-07
          • 2015-07-23
          • 2012-09-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多