我想知道是否可以排除组内部分匹配。
我相信/(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正则表达式方言写的。
答案 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中不可用。