否定了前瞻性的混乱

时间:2016-06-18 20:37:49

标签: javascript regex regex-lookarounds

我正在尝试匹配符合模式name (CA)barbaz (UK)的字符串。我似乎已经使用答案here解决了这个问题,但这就是我的开始,我想知道为什么它不起作用:

var r1 = /^.+(?!\([A-Z]{2}\))$/;

r1.test('foo'); //true

r1.test('foo (US)'); //whoops -also true

从阅读否定的预测doc我希望任何未遵循的字符串例如(JP)会导致匹配,而 的任何内容都会导致匹配,例如(DE)会失败。 (只有前者​​得到满足)。

我想也许.+有点“消耗”一切,使前瞻无效,所以我试过

r2 = /^[^()]+(?!\([A-Z]+\))$/;

r2.test('name (US)'); //false

r2.test('foo('); //whoops -also false

但是我需要foo(之类的东西来匹配。

为什么我的第一次尝试失败了?

1 个答案:

答案 0 :(得分:1)

在你的第一个表达式中,.+使用整个字符串,然后测试前瞻 - 它不匹配,因为没有剩下的字符。为了实现您的目标,您可以使用/^(?!.+\([A-Z]{2}\)$).+$/ - 首先检查不存在的不需要的构造,然后匹配。

请参阅https://regex101.com/r/aG7xZ0/1样本