【问题标题】:Java Regex negative lookahead wrong matchJava Regex 负前瞻错误匹配
【发布时间】:2014-05-17 19:52:18
【问题描述】:

我正在寻找空格字符后面的数字中出现前两个数字(以任何顺序)的字符串。首先我尝试了

(\d)(\d)\s\d*(\1|\2)\d*[\1\2&&[^\3]][\d]*

但似乎我不能使用带有反向引用的括号。我尝试使用前瞻功能而不是

(\d)(\d)\s\d*(\1|\2)\d*(?!\3(\1|\2))\d*

但我错了。这个想法是“查找两个数字,后跟一个空格,后跟零个或多个数字,然后是捕获的任何一个数字,然后是零个或多个数字,然后是其中一个捕获的数字不是我之前得到的数字,后跟零个或多个数字“。21 20329 是匹配的。为什么?如何查找我需要的字符串?

【问题讨论】:

    标签: java regex string regex-lookarounds


    【解决方案1】:

    这更简单。

    ^(\d)(\d) (?=.*?\1)(?=.*?\2)\d+
    

    demo

    1. 第一次前瞻确保第 1 组捕获的数字出现在字符串后面的某个位置。
    2. 第二个前瞻确保第 2 组捕获的数字出现在字符串后面的某个位置。
    3. 如果满足这些条件,\d+ 会占用空格后面的所有数字。

    【讨论】:

    • 谢谢,这很有用。那个网站也很有帮助。我希望我能支持你的答案,但我没有声誉,对不起。
    • @user3648292:但你可以接受这个答案(你也会因此得到一些分数)。请阅读About SO,因为您的状态表明您还没有这样做。
    • 嘿,我又看了一遍,糊涂了。看起来只有当\1在\2之前才会匹配,对吗?如果是这样,在某些情况下会出错,顺序根本不重要
    • @user3648292 感谢您的反馈,很高兴它有效。不,答案根本不重要。请参阅 [demo](user3648292) 这是因为当引擎评估前瞻时,它确实会植入字符串中的某个位置。前瞻后的位置没有改变,因此两个前瞻可以按任意顺序排列。见Mastering Lookahead and Lookbehind
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    • 1970-01-01
    • 2011-10-07
    相关资源
    最近更新 更多