代码之家  ›  专栏  ›  技术社区  ›  levik

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

  •  13
  • levik  · 技术社区  · 17 年前

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

    (?:^|.....)
    

    ?

    6 回复  |  直到 17 年前
        1
  •  21
  •   Tomalak    17 年前

    (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
  •  19
  •   Daniel LeCheminant    16 年前

    你可能是在这种背景下看到的

    (?:...)
    

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

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

    (?:^|....)
    

        3
  •  3
  •   Eli    17 年前

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

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

        4
  •  3
  •   Trampas Kirk    17 年前

    简短回答

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

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

    非捕获组的符号为:

    (?:<expresson>)
    

    在您展示的实例中,插入符号(^)是表达式的一部分,而不是捕获组符号的一部分。在这个例子中,它也不是一个特殊的角色。

    看起来他们正在使用带有重音符号的“or”运算符(管道)。因此,他们希望匹配管道右侧的叉号或其他符号,但不将表达式作为一个组来捕获(通过 ?: 在字符分组的开头。

    总的来说

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

        5
  •  2
  •   vartec    17 年前
        6
  •  1
  •   Quintin Robinson    17 年前

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

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

    编辑:应该是这样,非捕获似乎很好。