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

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

例如,

给定字符串:aaxxbbaxb
模式:a [az] {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[az]{0,3}b", Pattern.CASE_INSENSITIVE); Matcher match = pattern.matcher("aaxxbbaxb"); while (match.find()) { System.out.println(match.group()); } 

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

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

(请参阅: 与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 + ")"); } } } } 

您实际上是在输入字符串中搜索字符串ab,a_b和a__b,其中_表示一个非空白字符,其值不关心。

这是三个搜索目标。 我能想到的最有效的方法是使用像Knuth-Morris-Pratt算法这样的搜索算法,并进行一些修改。 实际上你的伪代码将是这样的:

 for i in 0 to sourcestring.length check sourcestring[i] - is it a? if so, check sourcestring[i+x] // where x is the index of the search string - 1 if matches then save i to output list else i = i + searchstring.length 

很明显,如果你有一个位置匹配,你必须检查子串的内部字符,以确保它们是按字母顺序排列的。

运行算法3次,每个搜索项一个。 毫无疑问,比尝试使用模式匹配进行搜索要快得多。

编辑 – 抱歉,没有正确阅读问题。 如果你必须使用正则表达式,那么以上内容对你不起作用。

你能做的一件事是:

  • 创建所有可能包含4个字符或更长字符的子串(如果您的String很大,祝你好运)
  • 为每个子字符串创建一个新的Matcher
  • 做一个匹配()而不是一个find()
  • 计算子字符串的相对偏移量和匹配器信息的绝对偏移量