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

时间:2009-03-02 16:52:55

标签: javascript regex

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

(?:^|.....)

我知道在跟随一个角色时意味着“零次或一次”,但不知道在这种情况下它意味着什么。

6 个答案:

答案 0 :(得分:21)

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

(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组与您相关的第一组,而不是正则表达式中第一组

答案 1 :(得分:19)

你可能在这种背景下看到它

(?:...)

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

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

(?:^|....)

表示“匹配行的开头或匹配...”但不捕获该组或将其用于反向引用。

答案 2 :(得分:3)

(?:some stuff)表示您不希望单独匹配括号中的表达式。通常,在括号中分组的正则表达式的片段被分组并且可以单独引用(这使用反向引用)。

请参阅http://www.regular-expressions.info/brackets.html

答案 3 :(得分:3)

简答

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

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

非捕获组的表示法是:

(?:<expresson>)

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

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

一般

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

答案 4 :(得分:2)

“(?:x)匹配'x'但不记得匹配。”

https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Regular_Expressions

答案 5 :(得分:1)

?:通常表示使该组成为非捕获组。您可以进行一些研究here

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

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