匹配“aa”与“aaaa”在java中返回2的计数 - 我希望它为3

时间:2014-03-29 02:26:38

标签: java regex pattern-matching

我试图理解Java中的模式匹配。但是,我对以下代码的输出感到困惑。它会打印一个2的数字,同时匹配" aa"反对" aaaa"但我希望它能打印3,因为' a'接着是' a'在给定的字符串中发生三次。任何人都可以解释这里的问题是什么吗?

Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aaaa");
int count = 0;
while(m.find())
  count++;
System.out.println(count);

2 个答案:

答案 0 :(得分:4)

匹配器不会找到重叠匹配。因此,由于第一个匹配在索引0处找到,长度为2,所以它不会在索引2之前开始寻找下一个匹配,并且找不到从索引1开始的潜在匹配。

如果您想查找重叠匹配,可以使用m.find(start),其中start的索引比您之前的匹配高一个。例如:

Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aaaa");
int count = 0;
int start = 0;
while(m.find(start)) {
  count++;
  start = m.start() + 1;
}
System.out.println(count);

答案 1 :(得分:0)

搜索文字字符串时,您还可以使用indexOf

public class Test  {
   public static final void main(String[] ignored)  {
     String toFind = "aa";
     String toSearch = "aaaa";

     int idxLastFound = 0;
     int foundCount = 0;

     while(idxLastFound <= (toSearch.length() - toFind.length()))  {
        idxLastFound = toSearch.indexOf(toFind, idxLastFound);
        if(idxLastFound == -1)  {
           break;
        }
        System.out.println("Found at " + idxLastFound);
        idxLastFound++;
        foundCount++;
     }

     System.out.println("Found " + foundCount + " times");
   }
}

输出:

[C:\java_code\]java Test
Found at 0
Found at 1
Found at 2
Found 3 times