0

我想知道是否可以在组内排除部分匹配项。

我相信这/(foo((?:bar)|(bad)))/会导致匹配“foobar”或“foobad”以及包含“foobar”或“foobad”的第 1 组。我希望它匹配“foobar”或“foobad”,但第 1 组仅包含“foo”或“foobad”。我知道(?:...)正则表达式语法用于创建一个您以后无法引用的组,但上述用法意味着有 3 个组: \1 整个匹配项;\2 'bar' 或 'bad'; \NONE 是未使用的组 'bar';和 \3 为“坏”。

你知道我要去哪里吗?我想有选择地从另一个组中排除一个子组。

或者,我想以 OR 方式定义组 1 两次,/(foobar)|(foobad)/尽管我知道输入不会做我想要的。在这种情况下,如果将“foobad”作为输入,尝试访问match[1]会导致“未定义”错误。我知道这是因为它实际上将其分为第 1 组和/或第 2 组。

我正在用 javascript 正则表达式方言写这个。

4

3 回答 3

4

我希望它匹配“foobar”或“foobad”,但第 1 组仅包含“foo”或“foobad”。

正则表达式:

/(foo(?:(?=bar)|bad))/

这样做:第 1 组要么包含foo(仅当bar它直接出现在它之后),要么包含foobad.

于 2011-04-03T19:40:43.487 回答
0

(?:bar)- 匹配但不记得匹配。这些称为非捕获括号。无法从结果数组的元素[1], ..., [n]或预定义的 RegExp 对象的属性中调用匹配的子字符串$1, ..., $9

更多信息:Mozilla 开发者中心

于 2011-04-03T19:34:58.180 回答
0

这接近你想要的

/((?=foobar)foo|foobad)/

它是一个匹配的单个组foo(但只有从它开始匹配foobar)或foobad. 该形式(?=...)是一个零宽度的前瞻断言。

这不完全是您想要的,因为在这种情况下的匹配foobar只是fooIMO 能够使其匹配 foobar 但仅将 foo 分组在将匹配 foobad 的同一组中,而不是需要lookbehind 和 AFAIK 它在 javascript 中不可用。

于 2011-04-03T19:58:52.830 回答