如何在java中使用模式和匹配器来查找匹配数量?
我有以下代码如何在java中使用模式和匹配器来查找匹配数量?
Pattern keyPattern = Pattern.compile(key);
Matcher matcher = keyPattern.matcher(str);
return matcher.replaceAll(value);
这将替换与值STR中的密钥; 但我想知道多少个键的实例已被替换为值。 那么如何知道呢?
您可以在循环中使用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再次扫描字符串。
,而不是你可以做:
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++;
}
更好。 – 2010-01-11 07:33:34
同意。首先,您的解决方案必须每次都从头开始重新扫描。其次,如果(例如)替换字符串包含与键模式匹配的内容,它将给出错误的答案。 – 2010-01-11 08:36:02
实际上,如果一个人删除行 matcher = keyPattern.matcher(str);来自while循环的 ,它应该工作,对吧? – 2010-01-11 10:05:34
没有循环可以找到在同一拍摄。因为它可能会降低性能。 – GuruKulki 2010-01-11 07:39:59
即使有一个函数可以在没有循环的情况下调用,在内部它仍然会有一个循环,所以我认为你不会看到显着的性能改进。由于字符串只被扫描一次,所以上面列出的第一种方法应该能够提供良好的性能。以上答案可能是 – 2010-01-11 07:43:07