2010-01-11 141 views

回答

2

您可以在循环中使用find方法进行计数。有一个在Java tutorial一个例子:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

public class MatcherDemo { 

    private static final String REGEX = "\\bdog\\b"; 
    private static final String INPUT = "dog dog dog doggie dogg"; 

    public static void main(String[] args) { 
     Pattern p = Pattern.compile(REGEX); 
     Matcher m = p.matcher(INPUT); // get a matcher object 
     int count = 0; 
     while(m.find()) { 
      count++; 
      System.out.println("Match number "+count); 
      System.out.println("start(): "+m.start()); 
      System.out.println("end(): "+m.end()); 
     } 
    } 
} 

当你调用find,你可以在同一时间收集字符串的零部件和手动构建导致StringBuffer。或者,如果性能不是问题,则可以先进行计数,然后再用replaceAll再次扫描字符串。

+0

没有循环可以找到在同一拍摄。因为它可能会降低性能。 – GuruKulki 2010-01-11 07:39:59

+4

即使有一个函数可以在没有循环的情况下调用,在内部它仍然会有一个循环,所以我认为你不会看到显着的性能改进。由于字符串只被扫描一次,所以上面列出的第一种方法应该能够提供良好的性能。以上答案可能是 – 2010-01-11 07:43:07

1

,而不是你可以做:

int num = 0; 
Pattern keyPattern = Pattern.compile(key); 
Matcher matcher = keyPattern.matcher(str); 
while(matcher.find()){ 
    str = matcher.replaceFirst(); 
    matcher = keyPattern.matcher(str); //don't know if this line is necessary 
    num++; 
} 
+0

更好。 – 2010-01-11 07:33:34

+1

同意。首先,您的解决方案必须每次都从头开始重新扫描。其次,如果(例如)替换字符串包含与键模式匹配的内容,它将给出错误的答案。 – 2010-01-11 08:36:02

+0

实际上,如果一个人删除行 matcher = keyPattern.matcher(str);来自while循环的 ,它应该工作,对吧? – 2010-01-11 10:05:34