有效地找到正则表达式的所有重叠匹配

这是与java正则表达式匹配的所有重叠子串的后续。

有没有办法让这段代码更快?

public static void allMatches(String text, String regex) { for (int i = 0; i < text.length(); ++i) { for (int j = i + 1; j <= text.length(); ++j) { String positionSpecificPattern = "((?<=^.{"+i+"})("+regex+")(?=.{"+(text.length() - j)+"}$))"; Matcher m = Pattern.compile(positionSpecificPattern).matcher(text); if (m.find()) { System.out.println("Match found: \"" + (m.group()) + "\" at position [" + i + ", " + j + ")"); } } } } 

在另一个问题中,您提到了Matcher的region()方法,但您没有充分利用它。 使它如此有价值的是锚点将在区域边界处匹配,就好像它们是独立字符串的边界一样。 假设你已经设置了useAnchoringBounds()选项,但这是默认设置。

 public static void allMatches(String text, String regex) { Matcher m = Pattern.compile(regex).matcher(text); int end = text.length(); for (int i = 0; i < end; ++i) { for (int j = i + 1; j <= end; ++j) { m.region(i, j); if (m.find()) { System.out.printf("Match found: \"%s\" at position [%d, %d)%n", m.group(), i, j); } } } } 

给出您的示例字符串和正则表达式:

 allMatches("String t = 04/31 412-555-1235;", "^\\d\\d+$"); 

...我得到这个输出:

 Match found: "04" at position [11, 13) Match found: "31" at position [14, 16) Match found: "41" at position [17, 19) Match found: "412" at position [17, 20) Match found: "12" at position [18, 20) Match found: "55" at position [21, 23) Match found: "555" at position [21, 24) Match found: "55" at position [22, 24) Match found: "12" at position [25, 27) Match found: "123" at position [25, 28) Match found: "1235" at position [25, 29) Match found: "23" at position [26, 28) Match found: "235" at position [26, 29) Match found: "35" at position [27, 29)