[英]Java regex - overlapping matches
在以下代码中:
public static void main(String[] args) {
List<String> allMatches = new ArrayList<String>();
Matcher m = Pattern.compile("\\d+\\D+\\d+").matcher("2abc3abc4abc5");
while (m.find()) {
allMatches.add(m.group());
}
String[] res = allMatches.toArray(new String[0]);
System.out.println(Arrays.toString(res));
}
结果是:
[2abc3, 4abc5]
我希望它是
[2abc3, 3abc4, 4abc5]
如何实现?
使匹配器尝试从后一个\\d+
开始其下一次扫描。
Matcher m = Pattern.compile("\\d+\\D+(\\d+)").matcher("2abc3abc4abc5");
if (m.find()) {
do {
allMatches.add(m.group());
} while (m.find(m.start(1)));
}
不确定这在 Java 中是否可行,但在 PCRE 中您可以执行以下操作:
(?=(\\d+\\D+\\d+)).
解释
该技术是在前瞻中使用匹配组,然后“吃掉”一个字符以继续前进。
(?=
: 正向前瞻的开始
(
: 开始匹配组 1
\\d+
:匹配一个数字一次或多次\\D+
:匹配一个非数字字符一次或多次\\d+
:匹配一个数字一次或多次)
: 第 1 组结束)
: 前瞻结束.
: 匹配任何东西,这是为了“前进”。感谢Casimir et Hippolyte,它似乎真的可以在 Java 中工作。 您只需要添加反斜杠并显示第一个捕获组: (?=(\\\\d+\\\\D+\\\\d+)).
. 在www.regexplanet.com 上测试:
HamZa的上述解决方案在Java中完美运行。 如果你想在文本中找到特定的模式,你所要做的就是:
String regex = "\d+\D+\d+";
String updatedRegex = "(?=(" + regex + ")).";
regex
是您正在寻找的模式并且要重叠,您需要用(?=(" at the start and ")).
将其包围(?=(" at the start and ")).
在末尾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.