正则表达式:不要在组中包含子字符串

时间:2011-04-03 19:27:54

标签: javascript regex regex-group

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

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

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

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

我是用javascript正则表达式方言写的。

3 个答案:

答案 0 :(得分:4)

  

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

正则表达式:

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

执行此操作:第1组包含foo(仅当bar直接在其之后)或包含foobad

答案 1 :(得分:0)

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

更多信息:Mozilla Developer Center

答案 2 :(得分:0)

这接近你想要的

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

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

这不完全是你想要的,因为foobar的匹配只是foo,但是IMO能够让它与foobar匹配,但只在fobobad所在的同一组中分组foo相反,需要lookbehind和AFAIK,它在javascript中不可用。