我正在尝试匹配不符合模式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(
之类的东西来匹配。
为什么我的第一次尝试失败了?
答案 0 :(得分:1)
在你的第一个表达式中,.+
使用整个字符串,然后测试前瞻 - 它不匹配,因为没有剩下的字符。为了实现您的目标,您可以使用/^(?!.+\([A-Z]{2}\)$).+$/
- 首先检查不存在的不需要的构造,然后匹配。