【问题标题】:Regex negative lookahead not working as expected正则表达式负前瞻未按预期工作
【发布时间】:2016-03-07 12:59:58
【问题描述】:

我有以下正则表达式:

[a-zA-Z0-9. ]*(?!cs)

和字符串

Hotfix H5.12.1.00.cs02_ADV_LCR

我只想匹配到

Hotfix H5.12.1.00

但正则表达式匹配直到“cs02”

负前瞻不应该完成这项工作吗?

【问题讨论】:

标签: regex


【解决方案1】:

您可以考虑使用tempered greedy token:

(?:(?!\.cs)[a-zA-Z0-9. ])*

请参阅regex demo。

无论.cs 是否存在于字符串中,这都会起作用,因为经过调和的贪婪令牌匹配来自[a-zA-Z0-9. ] 字符类的任何0+ 个字符,而不是.cs。

【讨论】:

    【解决方案2】:

    您需要使用积极的前瞻而不是消极的前瞻。

    [a-zA-Z0-9. ]*(?=\.cs)
    

    或

    [a-zA-Z0-9. ]+(?=\.cs)
    

    请注意,您的正则表达式 [a-zA-Z0-9. ]*(?!cs) 是贪婪的,并且匹配所有字符,直到它到达一个边界,该边界后面没有 cs。见here。

    第一个模式[a-zA-Z0-9. ]+ 贪婪地匹配Hotfix H5.12.1.00.cs02,因为这个模式贪婪地匹配字母、点和空格。一旦它看到下划线字符,它就会在满足两个条件的地方停止匹配,

    1. _ 不会被 [a-zA-Z0-9. ]+ 匹配
    2. _ 不是 cs

    另外两场比赛也一样。

    【讨论】:

    • 谢谢,这行得通,但由于我需要 cs 字符串存在与否,Wiktor Stribiżew 提供的否定前瞻答案可以完成工作
    • 这个regex101.com/r/dS7cZ2/3 ?请注意,默认情况下启用 php g。不知道为什么你愿意使用负前瞻而不是简单的正前瞻。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-14
    • 2021-10-11
    • 2011-10-14
    • 2010-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多