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

时间:2011-09-06 10:32:21

标签: java regex matcher

我正在尝试将 ALL 输入字符串中的子字符串与给定的模式匹配。

例如,

给定字符串: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类,只要它有效:)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

您实际上在输入字符串中搜索字符串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次,每个搜索项一次。毫无疑问,比尝试使用模式匹配进行搜索要快得多。

编辑 - 抱歉,没有正确阅读问题。如果您 使用正则表达式,则上述内容对您无效。

答案 2 :(得分:0)

你可以做的一件事是:

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