【问题标题】:negated lookahead confusion否定前瞻混淆
【发布时间】:2016-06-18 20:37:48
【问题描述】:

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

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

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

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

通过阅读否定的前瞻doc,我希望任何没有跟随的字符串,例如(JP) 将导致匹配,而任何 is 后跟例如(DE) 会失败。 (仅满足前者)。

我认为.+ 可能有点“消耗”一切,使前瞻无效,所以我尝试了

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

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

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

但是我需要像 foo( 这样的东西来匹配。

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

【问题讨论】:

    标签: javascript regex regex-lookarounds


    【解决方案1】:

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

    请参阅https://regex101.com/r/aG7xZ0/1 与您的样品

    【讨论】:

    • 感谢您的链接。你能详细说明你是如何使用 $ 的吗?
    • 它只是用来确保(XX)只匹配在字符串的末尾,而不是在中间的某个地方,所以Hello (XX) World是有效的。
    • 很酷,我认为这涵盖了前瞻内的那个,但最后还有.+$
    • 简单地匹配所有内容到最后 - 尽管你可以删除 $,因为 + 无论如何都匹配惰性。
    • 前瞻本身不匹配任何内容,因此您需要.+ 进行实际匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 2016-07-08
    • 1970-01-01
    相关资源
    最近更新 更多