【发布时间】:2009-03-02 16:52:55
【问题描述】:
我正在查看这个子表达式(这是在 JavaScript 中):
(?:^|.....)
我知道 ? 当它跟在一个字符后面时表示“零次或一次”,但不确定在这种情况下它是什么意思。
【问题讨论】:
-
看起来像一个矛盾的猫王,带着蓬蓬…… :p :D
标签: javascript regex
我正在查看这个子表达式(这是在 JavaScript 中):
(?:^|.....)
我知道 ? 当它跟在一个字符后面时表示“零次或一次”,但不确定在这种情况下它是什么意思。
【问题讨论】:
标签: javascript regex
在使用组时,您通常有几个选项可以修改组的行为:
(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 组与您相关的第一个组,而不是 正则表达式中的第一个组。
【讨论】:
您可能在这种情况下看到它
(?:...)
这意味着该组不会被捕获或用于反向引用。
编辑:反映您修改后的问题:
(?:^|....)
表示“匹配行首或匹配...”,但不要捕获组或将其用于反向引用。
【讨论】:
(?:some stuff) 表示您不想单独匹配括号中的表达式。通常,括号中分组的正则表达式的各个部分是分组的,可以单独引用(这称为使用反向引用)。
【讨论】:
它将(括号中的)组标记为non-capturing 组。
非捕获组的表示法是:
(?:<expresson>)
在您提供的实例中,插入符号 (^) 是表达式的一部分,而不是捕获组符号的一部分。而且这个实例也不是特殊字符。
看起来他们正在使用带有插入符号的“或”运算符(管道)。因此,他们希望匹配插入符号或管道右侧的任何内容,但不将表达式捕获为一个组(通过分组字符开头的?: 完成。
非捕获组允许您以不是back-refernceable 的方式对表达式进行分组,并且还会提高表达式的性能。
【讨论】:
"(?:x) 匹配 'x' 但不记得匹配。"
https://developer.mozilla.org/en/Core_JavaScript_1.5_Guide/Regular_Expressions
【讨论】:
【讨论】: