我正在查看这个子表达式(这是在JavaScript中):
(?:^|.....)
我知道?在跟随一个角色时意味着“零次或一次”,但不知道在这种情况下它意味着什么。
答案 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)
表示您不希望单独匹配括号中的表达式。通常,在括号中分组的正则表达式的片段被分组并且可以单独引用(这使用反向引用)。
答案 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)