【问题标题】:Multiple Negative Lookahead多重负前瞻
【发布时间】:2016-04-25 17:45:41
【问题描述】:

前三个字符必须是大写字母,不包括 I、O、S 或 Z。然后是破折号,然后是四个字符,可以是 3 以外的任何字符。我有这个,但第一个负前瞻也捕获了第一个之外的东西捕获组。

^((?!.*[IOSZ])[A-Z]{3})-((?!.*3)(.{4}))$

例如,我想捕获AAA-444Z。

【问题讨论】:

    标签: regex negative-lookahead


    【解决方案1】:

    您应该从您的前瞻中删除.*,因为您想匹配 3 个字符并将限制数从捕获组中删除。最后一部分也使用否定字符类:

    ^((?![IOSZ])[A-Z]){3}-[^3]{4}$
    

    Demo

    如果您想使用两个否定前瞻,请使用以下内容:

    ^((?![IOSZ])[A-Z]){3}-((?!3).){4}$
    

    Demo

    请注意,重点是当您使用环视时,您希望指定一个模式在一个特殊模式之后或之前,当您想检查字符数时,您需要说正则表达式引擎来考虑整个基于环视的模式的限制。在第一个(?![IOSZ])[A-Z]) 和第二个((?!3).)。

    【讨论】:

    • 谢谢,我想通过两个负面的前瞻来理解机制
    • ^((?![IOSZ])([A-Z]{3}))-((?!3)(.{4}))$ 也会这样做
    • 我选择你的答案是因为它更容易理解。
    【解决方案2】:

    你不需要任何前瞻,因为你可以使用这个正则表达式:

    ^[A-HJ-NP-RT-Y]{3}-[^3]{4}$
    
    • [A-HJ-NP-RT-Y]{3} 将匹配 3 个不是 I, O, S or Z 的大写字母实例。
    • [^3]{4} 匹配任何不是3 的字符。

    RegEx Demo

    根据下面的评论,如果您真的只想负前瞻,请使用:

    ^(?:(?![IOSZ])[A-Z]){3}-(?:(?!3).){4}$
    

    Regex Demo 2

    【讨论】:

    • 谢谢。我想用消极的前瞻性来理解这一点,而不是回答问题。
    • 非常感谢!我不知道非捕获组
    猜你喜欢
    • 2020-07-03
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 2011-10-07
    • 2019-07-04
    • 2011-01-15
    • 2021-10-11
    相关资源
    最近更新 更多