【问题标题】:positive look behind doesn't work but look ahead works积极的向后看是行不通的,但向前看是有效的
【发布时间】:2012-10-10 07:35:18
【问题描述】:

我有一个包含所有数字的字符串。

我想检查是否:

  1. 所有数字都在0-4的范围内,并且
  2. 字符串的最小长度应该是5

所以,我使用了这个正则表达式:

(?=^\d{5,}$)(^[0-4]*$) //works

正如预期的那样

但是上面的正则表达式在正面看后面时不起作用

(?<=^\d{5,}$)(^[0-4]*$) //doesn't work

为什么positive look behind 不起作用但look ahead 在这种情况下起作用

编辑

是的,我可以使用

^[0-4]{5,}$

但问题是为什么look-behind 在上述情况下不起作用

这是关于THIS 问题lookahead 工作但不是lookbehind

【问题讨论】:

    标签: regex regex-lookarounds


    【解决方案1】:

    你不应该从后面看,以匹配“看behind断言”吗?

    (^[0-4]*$)(?<=^\d{5,}$)
    

    就目前而言,你想要这个:

    • 以下 5 个或更多字符(构成整个字符串)
    • 字符串的开头
    • 包含[0-4]

    这基本上归结为

    • false

    【讨论】:

    • ohh..nice..这可能很烦人,但为什么不能是 (?&lt;=^\d{5,}$)(^[0-4]*$) 这可能意味着在匹配 [0-4]* 之前查找 5 个或更多数字
    • 就是这个意思。但是如果你向后看,在字符串的开头,你什么也找不到。如果你向后看,从字符串的末尾,你会发现一些东西,但是你在字符串的末尾,在你面前找不到[0-4]。正则表达式实际上是一种需要适合字符串的模式,而不仅仅是一堆魔法。
    • 如果您要删除^$ 锚,您的正则表达式可能匹配99999222,因为它可以找到[0-4]* == 222,同时看到\d{5,} == 99999[0-4]* 后面的点开始匹配。
    【解决方案2】:

    问题是您没有将后面的外观固定到输入的末尾。
    试试这个:

    (?<=^\d{5,})(^[^5-9]*)$ // $ at end (and removed now-redundant $ from each look behind)
    

    此外,否定否定词更难阅读。只需使用[0-4] 而不是[^5-9]

    最后,为什么不用这个:

    ^[0-4]{5,}$
    

    【讨论】:

    • nice..我实际上想知道为什么向后看不起作用..这是参考this 问题在哪里向前看有效但不向后看
    • 这不能回答问题。 ^ 锚的后视之前基本上默认为false,这就是问题所在。
    猜你喜欢
    • 2016-02-20
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-20
    • 1970-01-01
    相关资源
    最近更新 更多