Java 9+:利用正则表达式高效统计字符串中多子串出现次数并进行比较

Java 9+:利用正则表达式高效统计字符串中多子串出现次数并进行比较
最新回答
泛黄的咖啡店

2021-12-31 15:18:46

在Java 9及以上版本中,可利用java.util.regex.Pattern和Matcher.results().count()高效统计字符串中多子串出现次数并进行比较,核心步骤如下:

  • 编译正则表达式模式:使用Pattern.compile()将目标子串编译为Pattern对象。例如统计"cat"和"dog"时,分别编译为Pattern pCat = Pattern.compile("cat");和Pattern pDog = Pattern.compile("dog");。
  • 创建匹配器:通过Pattern.matcher(String)为待搜索字符串创建Matcher对象。例如Matcher mCat = pCat.matcher(s);。
  • 获取匹配结果流并计数:调用Matcher.results()获取Stream<MatchResult>,再通过count()统计匹配次数。例如long catCount = mCat.results().count();。
示例代码import java.util.regex.Matcher;import java.util.regex.Pattern;public class SubstringCounter { public static boolean catsDogs(String s) { Pattern pCat = Pattern.compile("cat"); Pattern pDog = Pattern.compile("dog"); Matcher mCat = pCat.matcher(s); long catCount = mCat.results().count(); Matcher mDog = pDog.matcher(s); long dogCount = mDog.results().count(); return (catCount == dogCount); } public static void main(String[] args) { System.out.println("catdog: " + catsDogs("catdog")); // true (1 cat, 1 dog) System.out.println("catcat: " + catsDogs("catcat")); // false (2 cat, 0 dog) System.out.println("1cat1cadodog: " + catsDogs("1cat1cadodog")); // true (1 cat, 1 dog) System.out.println("dogcatdogcat: " + catsDogs("dogcatdogcat")); // true (2 cat, 2 dog) System.out.println("catdogcatdogdog: " + catsDogs("catdogcatdogdog")); // false (2 cat, 3 dog) System.out.println("empty string: " + catsDogs("")); // true (0 cat, 0 dog) System.out.println("no match: " + catsDogs("abcde")); // true (0 cat, 0 dog) }}注意事项
  • Java版本要求:Matcher.results()是Java 9引入的特性,Java 8及以下版本需采用替代方案:

    使用String.replaceAll()结合长度计算:s.length() - s.replaceAll("cat", "").length() / "cat".length()。

    手动indexOf循环(违背无循环要求)。

    引入第三方库。

  • 正则表达式灵活性:支持完整正则语法,如忽略大小写(Pattern.CASE_INSENSITIVE)或单词边界(bcatb)。
  • 性能考量:正则引擎内部计算可能对长字符串或复杂模式产生性能开销,但多数场景下可读性与性能平衡良好。
  • 子串重叠问题:默认不计算重叠子串(如"catcatcat"中"cat"匹配3次)。若需处理重叠,需使用零宽断言等复杂模式。
总结

Java 9+的Pattern和Matcher.results().count()提供了一种现代、简洁且高效的方式统计子串出现次数,避免了显式循环,提升了代码可读性。实际开发中需根据Java版本和需求选择合适方案。