【问题标题】:Why does my regex containing \d{1,} together with a negative lookahead still match, where it shouldn't?为什么我的正则表达式包含 \d{1,} 以及负前瞻仍然匹配,它不应该匹配?
【发布时间】:2011-08-16 12:00:11
【问题描述】:

我正在尝试使用 Java 中的正则表达式匹配字符串中的坐标对。我明确希望使用否定前瞻来排除字符串。

待匹配:

558,228
558,228,
558,228,589
558,228,A,B,C

不匹配:

558,228,<Text>

正则表达式 ^558,228(?!,&lt;).* 完成了这项工作,而 ^\d{1,},\d{1,}(?!,&lt;).* 则没有。它与元字符 \d 而不是值的正则表达式相同。任何想法为什么?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    原因是末尾的.* 部分。它匹配之前未匹配的所有内容。 结合 \d{1,},它允许匹配少于 3 位数字,它将如下所示: ^\d{1,},\d{1,}(?!,&lt;) 将匹配 558,22.* 将匹配剩余部分 8,&lt;Text&gt;

    【讨论】:

    • 是的,第二个 \d{1,} 将匹配 22,点将匹配其余部分。
    • 嘿,你在我写答案的时候编辑了你的! ;) +1
    • @stema:我觉得它有点短。我有这种感觉,这不是唯一的原因 ;-) 很有趣,我们甚至使用了几乎相同的措辞!
    • 我明白了,谢谢。问题是数字是坐标,所以长度可能会有所不同。我假设没有量词“匹配大多数可能的标记”
    • @Daniel,我解决了这个问题!你以前用过所有格量词吗?这是第一次对我有用。
    【解决方案2】:

    问题在于\d{1,} 部分与末尾的.* 结合使用。

    你的情况

    558,228,<Text>
    

    ^\d{1,},\d{1,}(?!,&lt;) 匹配“&gt;558,22”,.* 匹配其余的“8,&lt;Text&gt;

    你可以使用所有格限定词++来解决这个问题

    ^\d+,\d++(?!,<)(.*)
    

    here online on Regexr

    \d++ 是一个很少使用的所有格量词,在这里很有用。 ++ 表示尽可能匹配至少一次并且不要回溯。这意味着一旦找到数字,它就不会返回。

    Java Quantifier tutorial

    【讨论】:

    • 感谢在线正则表达式测试器。这可能会有所帮助。由于这些值是坐标,因此数字的数量不固定。任何想法如何保持灵活性?
    • @mamuesstack 我找到了解决您问题的方法!!!我更新了我的答案和 Regexr 链接。
    • 我不知道 '++' 量词,谢谢。 {1,3} 不是也很贪心吗?
    • @mamuesstack 是的,但它总是尝试匹配完整的表达式,如果在匹配尽可能多的数字时这是不可能的,那么它将回溯,意味着返回最后一个数字和尝试再次匹配其余部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 2015-08-22
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多