Java递归(?)重复(?)深(?)模式匹配

我正在尝试获取输入字符串中与给定模式匹配的所有子字符串.

例如,

给定字符串:aaxxbbaxb
模式:a [a-z] {0,3} b
(我实际想要表达的是:所有以a开头并以b结尾的模式,但在它们之间最多可以包含2个字母)

我想要的确切结果(及其索引):

aaxxb:索引0~4
axxb:指数1~4
axxbb:指数1~5
axb:指数6~8

但是当我使用Pattern.compile()和Matcher.find()运行Pattern和Matcher类时,它只给了我:

aaxxb:索引0~4
axb:指数6~8

这是我用过的一段代码.

Pattern pattern = Pattern.compile("a[a-z]{0,3}b",Pattern.CASE_INSENSITIVE);
Matcher match = pattern.matcher("aaxxbbaxb");
while (match.find()) {
    System.out.println(match.group());
}

如何检索与模式匹配的每一个字符串?

当然,它不必使用Pattern和Matcher类,只要它有效:)

最佳答案
(见:All overlapping substrings matching a java regex)

这是我提出的完整解决方案.它可以处理原始正则表达式中的零宽度模式,边界等.它查看文本字符串的所有子字符串,并通过在开头和结尾用适当数量的通配符填充模式来检查正则表达式是否仅在特定位置匹配.它似乎适用于我尝试的案例 – 虽然我没有做过广泛的测试.它肯定效率低于它可能的效率.

  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 + ")");
        }   
      }   
    }   
  }

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...