我正在寻找空格字符后面的数字中出现前两个数字(以任何顺序)的字符串。首先我尝试了
(\d)(\d)\s\d*(\1|\2)\d*[\1\2&&[^\3]][\d]*
但似乎我不能将括号与反向引用一起使用。我尝试使用前瞻功能来代替
(\d)(\d)\s\d*(\1|\2)\d*(?!\3(\1|\2))\d*
但我错了。这个想法是“查找两个数字,后跟一个空格,后跟零个或多个数字,后跟捕获的数字之一,后跟零个或多个数字,后跟捕获的数字之一(不是我之前得到的数字),后跟零个或多个数字”。21 20329 是一个匹配项。为什么?我如何查找我需要的字符串?
最佳答案
这更简单。
^(\d)(\d) (?=.*?\1)(?=.*?\2)\d+
参见demo
- 第一个前瞻确保第 1 组捕获的数字出现在字符串后面的某个位置。
- 第二个前瞻确保第 2 组捕获的数字出现在字符串后面的某个位置。
- 如果满足这些条件,
\d+
会吃掉空格后的所有数字。
关于Java正则表达式否定前瞻错误匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23715490/