需要统计一段文本中“【名称】”出现的次数。
两种方法,一种是用String的split,另一种是用正则表达式。
结果发现是正则表达式更快,快了1倍。
// 正则
public static int count(String text, String targetWord) {
Pattern pattern = Pattern.compile(targetWord);
Matcher matcher = pattern.matcher(text);
int count = 0;
while (matcher.find()) {
count++;
}
return count;
}
// String的split
public static int count1(String text, String targetWord) {
String[] split = text.split(targetWord);
return split.length;
}
开始运行:
public static void main(String[] args) {
long l = System.currentTimeMillis();
String text = "【名称】案件聚焦军【名称】";
StringBuffer t = new StringBuffer();
for (int i = 0; i < 10000; i++) {
t.append(text);
}
String targetWord = "【名称】";
int count = count(t.toString(), targetWord); //正则 20000 time: 9
// int count = count1(t.toString(), targetWord); //split 20000 time: 21
System.out.println(count);
long l1 = System.currentTimeMillis();
System.out.println("time: " + (l1 - l));
}
我们可以看到结果:“【名称】”出现的次数都对的上,都是20000次。运行时间的话,正则是9ms,String的split是21ms,正则快了1倍多。
而且split的计算不一定准确,如果“【名称】”不在开头,还需要将length减1,正则的就比较准确
而且正则的可以支持多个字段targetWord的匹配,代码如下:
public static int count(String text, List<String> targetWords) {
String targetWord = String.join("|", targetWords);
Pattern pattern = Pattern.compile(targetWord);
Matcher matcher = pattern.matcher(text);
int count = 0;
while (matcher.find()) {
count++;
}
return count;
}
开始运行:
public static void main(String[] args) {
long l = System.currentTimeMillis();
String text = "【名称】案件聚焦军【名称】【你好】";
StringBuffer a = new StringBuffer();
for (int i = 0; i < 10000; i++) {
a.append(text);
}
List<String> targetWords = new ArrayList<>();
targetWords.add("【名称】");
targetWords.add("【你好】");
int count = count(a.toString(), targetWords); // 正则 30000 time: 10
System.out.println(count);
long l1 = System.currentTimeMillis();
System.out.println("time: " + (l1 - l));
}
输出是目标字段出现30000次,时间是10ms。