java 的split 方法 处理一个字符串出现次数

本文详细介绍了Java中String.split()方法的使用技巧,包括如何处理特殊字符作为分隔符、如何保留所有分隔后的空字符串以及如何使用Apache Commons Lang库进行更简便的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java代码  收藏代码


在java.lang包中有String.split()方法,返回是一个数组

我在应用中用到一些,给大家总结一下,仅供大家参考:

1、如果用“.”作为分隔的话,必须是如下写法,String.split("\\."),这样才能正确的分隔开,不能用String.split(".");

2、如果用“|”作为分隔的话,必须是如下写法,String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");

“.”和“|”都是转义字符,必须得加"\\";

3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如,“acount=? and uu =? or n=?”,把三个都分隔出来,可以用String.split("and|or");

使用String.split方法分隔字符串时,分隔符如果用到一些特殊字符,可能会得不到我们预期的结果。 

我们看jdk doc中说明  

public String[] split(String regex)

 Splits this string around matches of the given regular expression. 

参数regex是一个 regular-expression的匹配模式而不是一个简单的String,他对一些特殊的字符可能会出现你预想不到的结果,比如测试下面的代码用竖线 | 分隔字符串,你将得不到预期的结果

 

复制代码
   String[] aa = "aaa|bbb|ccc".split("|");

    //String[] aa = "aaa|bbb|ccc".split("\\|"); 这样才能得到正确的结果

    for (int i = 0 ; i <aa.length ; i++ ) {

      System.out.println("--"+aa[i]); 

    } 
复制代码

 

用竖 * 分隔字符串运行将抛出java.util.regex.PatternSyntaxException异常,用加号 + 也是如此。

复制代码
    String[] aa = "aaa*bbb*ccc".split("*");

    //String[] aa = "aaa|bbb|ccc".split("\\*"); 这样才能得到正确的结果    

    for (int i = 0 ; i <aa.length ; i++ ) {

      System.out.println("--"+aa[i]); 

    }  
复制代码

 

显然, + * 不是有效的模式匹配规则表达式,用"\\*" "\\+"转义后即可得到正确的结果。

"|" 分隔串时虽然能够执行,但是却不是预期的目的,"\\|"转义后即可得到正确的结果。

还有如果想在串中使用"\"字符,则也需要转义.首先要表达"aaaa\bbbb"这个串就应该用"aaaa\\bbbb",如果要分隔就应该这样才能得到正确结果,

String[] aa = "aaa\\bbb\\bccc".split("\\\\");

  1.   System.out.println(":ab:cd:ef::".split(":").length);//末尾分隔符全部忽略    
  2.   System.out.println(":ab:cd:ef::".split(":",-1).length);//不忽略任何一个分隔符    
  3.   System.out.println(StringUtils.split(":ab:cd:ef::",":").length);//最前面的和末尾的分隔符全部都忽略,apache commons    
  4.   System.out.println(StringUtils.splitPreserveAllTokens(":ab:cd:ef::",":").length);//不忽略任何一个分隔符 apache commons     
  5. 输出:    
  6. 4    
  7. 6    
  8. 3    
  9. 6    


看了下jdk里String类的public String[] split(String regex,int limit)方法,感觉平时不太会用这方法,以为在用正则表达式来拆分时候,如果匹配到的字符是最后一个字符时,会拆分出两个空字符串,例如"o"split("o",5) or "o"split("o",-2)时候 结果是"" "" 也就是下图中红框里的内容,所以平时一般都用split(String regex)方法,其实也就等同于split(String regex,0)方法,把结尾的空字符串丢弃!




String的split方法用到的参数是一个正则式,虽然强大,但是有时候容易出错。而且string并没有提供简化版本。org.apache.commons.lang.StringUtils提供的split改变了这一状况,开始使用完整的字符串作为参数,而不是regex。同时,对类似功能的jdk版本的StringTokenizer,在内部方法splitWorker中有段注释:Direct code is quicker than StringTokenizer.也就是说,这个是更快的一个工具了~~

StringUtils里的split和splitPreserveAllTokens 底层都是调用splitWorker方法实现的
下面分别来理解下两个私有的splitWorker方法:


Java代码  收藏代码
  1. private static String[] splitWorker(String str, char separatorChar, boolean preserveAllTokens)  
  2. {  
  3.         // Performance tuned for 2.0 (JDK1.4)  
  4.   
  5.         if (str == null) {  
  6.             return null;  
  7.         }  
  8.         int len = str.length();  
  9.         if (len == 0) {  
  10.             return ArrayUtils.EMPTY_STRING_ARRAY;  
  11.         }  
  12.         List list = new ArrayList();  
  13.         int i = 0, start = 0;  
  14.         boolean match = false;  
  15.         boolean lastMatch = false;  
  16.         while (i < len) {  
  17.             if (str.charAt(i) == separatorChar) {  
  18.                 if (match || preserveAllTokens) {  
  19.                     list.add(str.substring(start, i));  
  20.                     match = false;  
  21.                     lastMatch = true;  
  22.                 }  
  23.                 start = ++i;  
  24.                 continue;  
  25.             }  
  26.             lastMatch = false;  
  27.             match = true;  
  28.             i++;  
  29.         }  
  30.         if (match || (preserveAllTokens && lastMatch)) {  
  31.             list.add(str.substring(start, i));  
  32.         }  
  33.         return (String[]) list.toArray(new String[list.size()]);  
  34.     }  
是一个核心方法,用于拆分字符串,其中字符c表示分隔符,另外布尔变量b表示c在首尾的不同处理方式。为真,则在首位留一个""的字符串。但是在中间是没有作用的。该方法执行如下操作:
  如果字符串为null,则返回null。
  如果字符串为"",则返回""。
  用i作为指针遍历字符串,match和lastMatch分别表示遇到和最后遇到可分割的内容。
    如果字符串中第一个就遇到c,则看b的值,如果为真,则会在结果数组中存入一个""。如果没遇到,match置真,lastMatch置假,表示有要分割的内容。
    一旦遇到c,则在结果数组中输出字符串在i之前的子字符串,并把起始点调整到i之后。且match置假,lastMatch置真。
  遍历结束,如果match为真(到最后也没有遇到c),或者lastMatch和b同为真(最后一个字符是c),则输出最后的部分(如果是后者,则会输出一个"")。


Java代码  收藏代码
  1. private static String[] splitWorker(String str, String separatorChars, int max, boolean preserveAllTokens)  
  2. {  
  3.         // Performance tuned for 2.0 (JDK1.4)  
  4.         // Direct code is quicker than StringTokenizer.  
  5.         // Also, StringTokenizer uses isSpace() not isWhitespace()  
  6.   
  7.         if (str == null) {  
  8.             return null;  
  9.         }  
  10.         int len = str.length();  
  11.         if (len == 0) {  
  12.             return ArrayUtils.EMPTY_STRING_ARRAY;  
  13.         }  
  14.         List list = new ArrayList();  
  15.         int sizePlus1 = 1;  
  16.         int i = 0, start = 0;  
  17.         boolean match = false;  
  18.         boolean lastMatch = false;  
  19.         if (separatorChars == null) {  
  20.             // Null separator means use whitespace  
  21.             while (i < len) {  
  22.                 if (Character.isWhitespace(str.charAt(i))) {  
  23.                     if (match || preserveAllTokens) {  
  24.                         lastMatch = true;  
  25.                         if (sizePlus1++ == max) {  
  26.                             i = len;  
  27.                             lastMatch = false;  
  28.                         }  
  29.                         list.add(str.substring(start, i));  
  30.                         match = false;  
  31.                     }  
  32.                     start = ++i;  
  33.                     continue;  
  34.                 }  
  35.                 lastMatch = false;  
  36.                 match = true;  
  37.                 i++;  
  38.             }  
  39.         } else if (separatorChars.length() == 1) {  
  40.             // Optimise 1 character case  
  41.             char sep = separatorChars.charAt(0);  
  42.             while (i < len) {  
  43.                 if (str.charAt(i) == sep) {  
  44.                     if (match || preserveAllTokens) {  
  45.                         lastMatch = true;  
  46.                         if (sizePlus1++ == max) {  
  47.                             i = len;  
  48.                             lastMatch = false;  
  49.                         }  
  50.                         list.add(str.substring(start, i));  
  51.                         match = false;  
  52.                     }  
  53.                     start = ++i;  
  54.                     continue;  
  55.                 }  
  56.                 lastMatch = false;  
  57.                 match = true;  
  58.                 i++;  
  59.             }  
  60.         } else {  
  61.             // standard case  
  62.             while (i < len) {  
  63.                 if (separatorChars.indexOf(str.charAt(i)) >= 0) {  
  64.                     if (match || preserveAllTokens) {  
  65.                         lastMatch = true;  
  66.                         if (sizePlus1++ == max) {  
  67.                             i = len;  
  68.                             lastMatch = false;  
  69.                         }  
  70.                         list.add(str.substring(start, i));  
  71.                         match = false;  
  72.                     }  
  73.                     start = ++i;  
  74.                     continue;  
  75.                 }  
  76.                 lastMatch = false;  
  77.                 match = true;  
  78.                 i++;  
  79.             }  
  80.         }  
  81.         if (match || (preserveAllTokens && lastMatch)) {  
  82.             list.add(str.substring(start, i));  
  83.         }  
  84.         return (String[]) list.toArray(new String[list.size()]);  
  85.     }  
也是一个核心方法,用于拆分字符串,其与上一个方法的不同之处在于其分隔符用字符串表示一组字符,且增加一个max变量,表示输出的字符串数组的最大长度。另外注意该方法的b如果为真,会在首尾及中间起作用,且如果分隔符字符串长度大于1,则数组中的""会更多(根据分隔符字符的数量)。该方法执行如下操作:
  如果字符串为null,则返回null。
  如果字符串为"",则返回""。
  之后的处理分三种情况,分别是分隔符字符串为null,则默认为" ";分割符字符串长度为1;分割符字符串为普通字符串。这三种处理的不同只是在当前遍历中的字符的判断问题。
    1.利用Character.isWhitespace方法判断每个字符是否为" "。
    2.先把字符串转化为一个char,然后就和前一个splitWorker方法类似。
    3.利用indexOf方法查找当前字符是否在分隔符字符串中,然后就和前一个splitWorker方法类似。
    需要注意的是,如果输出的数组的数量已经等于max的值,则把指针直接挪到最后,等待下次遍历的时候直接跳出。同时由于lastMatch和match都置为假,最后也不会输出""了。
   遍历结束,如果match为真(到最后也没有遇到c),或者lastMatch和b同为真(最后一个字符在分隔符字符串中),则输出最后的部分(如果是后者,则会输出一个"")。
<think>好的,我现在需要解决用户的问题:如何在Java中统计一个字符串中出现特定子字符串次数。让我仔细想想该怎么处理这个问题。 首先,用户的需求很明确,就是统计某个子字符串在源字符串中出现的次数。我需要回忆一下Java处理字符串的相关方法。通常,处理这类问题的方法可能有几种。例如,可以使用循环配合indexOf方法,或者使用正则表达式,甚至可能用Java 8的流来处理,不过后者可能比较复杂。 让我先考虑使用indexOf的方法。这种方法的基本思路是,在源字符串中不断查找目标子字符串的位置,每找到一次,就增加计数器,然后从找到的位置之后继续查找,直到找不到为止。例如,初始位置从0开始,每次找到子字符串后,新的起始位置应该是当前找到的位置加上子字符串的长度,这样可以避免重叠的情况。比如,在字符串"ababa"中查找"aba",如果允许重叠的话,会有两个结果,但如果每次跳过找到的位置加上子字符串长度,那么只会找到一个。不过用户可能想要的是统计所有可能的出现次数,包括重叠的情况,所以需要明确是否需要考虑重叠。但通常情况下,统计的是非重叠的次数。这一点可能需要向用户说明,但用户的问题中没有特别说明,可能需要假设是默认的非重叠统计。不过,用户可能希望两种方式都能处理,或者至少明确如何处理。 接下来,如何实现这个循环。首先,检查输入是否合理,比如子字符串是否为空,或者源字符串是否为空,避免出现错误。例如,如果子字符串长度大于源字符串,直接返回0。否则,初始化一个计数器count为0,然后初始化位置变量index为0。然后进入循环,使用indexOf方法,每次从index的位置开始查找,找到后count加1,然后更新index为找到的位置加上子字符串的长度。循环继续直到indexOf返回-1,表示没有更多的匹配。 例如,源字符串是"ababab",子字符串是"ab",那么第一次找到位置0,count变为1,index更新为0+2=2。第二次在位置2找到,count变为2,index变为4。第三次在位置4找到,count变为3,index变为6,此时源字符串长度是6,所以结束循环。总共有3次出现。这是正确的。 那如果子字符串是"aba",在源字符串"ababa"中,非重叠的话,第一次找到位置0,index变为3,然后在位置3找到,总共有两次。但如果是允许重叠,比如每次移动1位的话,那么可能会有不同的结果。但根据通常的做法,可能用户需要的是非重叠的情况。不过,这里可能需要明确,但用户的问题中没有说明,所以可能需要按常规处理方式,即非重叠的情况。 接下来,编写代码的大致步骤: 1. 定义方法,参数为源字符串str和子字符串subStr。 2. 检查subStr是否为空或长度为0,或者源字符串为空,此时返回0。 3. 初始化count为0,index为0。 4. 循环中,每次使用str.indexOf(subStr, index),如果结果为-1,退出循环。 5. 否则,count加1,index更新为找到的位置加上subStr的长度。 6. 循环结束后返回count。 例如,代码可能如下: public static int countOccurrences(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty() || subStr.length() > str.length()) { return 0; } int count = 0; int index = 0; while (index <= str.length() - subStr.length()) { int foundIndex = str.indexOf(subStr, index); if (foundIndex == -1) { break; } count++; index = foundIndex + subStr.length(); } return count; } 不过需要测试一些边界情况,例如子字符串出现在末尾的情况,或者刚好在中间的情况。 另一种方法是使用split方法,将源字符串按子字符串分割,然后数组的长度减1就是出现的次数。例如: public static int countOccurrencesSplit(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty()) { return 0; } String[] parts = str.split(Pattern.quote(subStr), -1); return parts.length - 1; } 但这种方法需要注意,split方法使用的是正则表达式,所以如果子字符串中有特殊字符,如.或者$等,需要用Pattern.quote()来转义。同时,split的第二个参数是限制分割次数,设为-1表示不限制,但这样可能会分割所有出现的地方。不过,这种方法可能无法正确处理重叠的情况,因为split会消耗掉子字符串,所以如果子字符串是"aa",在字符串"aaaa"中,split会分割成["", "", "", ""],所以长度-1是3次出现。而用indexOf的方法的话,假设子字符串长度为2,每次找到位置0,然后index变为2,找到位置2,总共有两次。所以两种方法结果可能不同。这说明split方法统计的是所有可能的非重叠出现的次数,而indexOf的方法也是如此。那为什么会得到不同的结果? 比如,在"aaaa"中,子字符串"aa": 使用indexOf方法,第一次找到0,index变为2,第二次找到2,count=2,index变为4,循环结束。所以返回2次。 而split方法split(subStr, -1),分割后的数组是 ["", "", ""],所以数组长度是3,减去1得到2次。这时候两者的结果一致。那可能我之前的例子中的测试错误? 可能我之前的例子中,split后的数组长度是3,所以返回2,这和indexOf的方法得到的次数是一致的。比如,字符串是"ababab",split用"ab"分割,得到["", "", "", ""],长度4,减去1得到3次,和indexOf方法一致。那这种情况下split方法似乎可行。但需要考虑特殊情况,例如当子字符串出现在开头或结尾的情况。 例如,字符串是"ababa",子字符串是"aba"。split("aba")的话,分割成["", "ba"],数组长度是2,所以次数是1。而用indexOf方法的话,第一次在0找到,index变为3,然后在位置3,源字符串长度是5,剩下的是"ba",无法再找到,所以count是1。split方法返回的是正确的。 那在这种情况下,split方法可能有效。但需要注意的是,split处理的是正则表达式,所以必须对子字符串进行转义,否则如果子字符串中有正则的元字符,会导致错误。例如,子字符串是".",这时候split(".")会分割成每个字符之间的空,这显然不正确。因此,在使用split方法时,必须用Pattern.quote(subStr)来转义子字符串中的特殊字符。 所以,split方法可以工作,但需要注意转义,并且在处理某些情况下可能与预期不同吗?比如,当子字符串是空字符串时,split会抛出异常,所以在代码中必须处理这种情况。例如,用户传入空的子字符串,应该直接返回0,或者在方法开始处处理。 例如,用户可能调用countOccurrences("abc", ""),这时候应该返回0,因为空字符串无法有效统计。或者根据Java中的定义,字符串中空字符串出现的次数是length+1次?例如,"abc"中,空字符串出现的位置是0,1,2,3,共四次。所以需要明确如何处理这种情况。但根据用户的问题,用户可能希望统计的是非空子字符串的出现次数,所以可能在方法开始时检查子字符串是否为空,如果是的话返回0。 综上,两种方法都可以,但需要考虑不同的情况: indexOf方法: 优点:直接,不需要处理正则表达式的问题,容易控制是否允许重叠(如果需要允许重叠,可以将index更新为foundIndex +1,而不是加上子字符串长度)。 缺点:需要手动处理循环。 split方法: 优点:代码简洁。 缺点:需要处理正则表达式转义,且无法处理重叠的情况。例如,如果用户希望统计重叠出现的次数,例如在"aaaa"中统计"aa"的次数,如果允许重叠的话,应该出现3次(在位置0,1,2),但split方法会得到非重叠的2次,而indexOf方法如果每次更新index为foundIndex+1,则可以统计到3次。因此,是否需要处理重叠的情况需要明确。 用户的问题中没有说明是否要考虑重叠的情况,所以可能需要提供两种方法,或者明确说明。 回到用户的问题,用户可能只是需要统计常规的非重叠次数,因此indexOf方法是更可靠的选择,同时可以处理不同情况。 此外,还有一种方法是使用正则表达式,通过Matcher的find方法,每次查找子字符串的出现,此时同样需要考虑是否允许重叠。例如: public static int countOccurrencesRegex(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty()) { return 0; } Pattern pattern = Pattern.compile(Pattern.quote(subStr)); Matcher matcher = pattern.matcher(str); int count = 0; while (matcher.find()) { count++; } return count; } 这种方法同样是非重叠的,因为每次find会自动跳过后面的字符。例如,在"aaaa"中找"aa",会找到0和2的位置,count为2次。而如果允许重叠,这种方法无法直接实现,需要调整正则表达式,例如使用正向预查或者其他方式,但可能比较复杂。 因此,如果用户需要统计所有可能的出现次数,包括重叠的情况,则需要另一种处理方式。例如,每次移动一个字符: public static int countOverlapping(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty() || subStr.length() > str.length()) { return 0; } int count = 0; int index = 0; while (index <= str.length() - subStr.length()) { int foundIndex = str.indexOf(subStr, index); if (foundIndex == -1) { break; } count++; index = foundIndex + 1; // 每次移动一个字符,而不是子字符串长度 } return count; } 例如,在"aaaa"中找"aa",index从0开始,找到0,count=1,index=1。找到1,count=2,index=2。找到2,count=3,index=3。此时,str.length() - subStr.length() =4-2=2,所以循环条件为index <=2。当index=3时,不满足循环条件,结束。总共有3次。这与预期重叠的情况一致。 因此,用户的问题可能需要明确是否需要处理重叠的情况,但通常默认是非重叠的。所以在回答时,应该说明这两种情况,并给出相应的代码示例。 总结可能的解决方案: 1. 使用indexOf方法,非重叠统计:每次移动子字符串长度。 2. 使用indexOf方法,允许重叠统计:每次移动1个字符。 3. 使用split方法,但需要注意转义问题。 4. 使用正则表达式Matcher的find方法。 接下来,编写示例代码,并解释不同方法之间的差异,以及如何选择。 另外,需要考虑边界情况,例如: - 源字符串或子字符串为空。 - 子字符串长度大于源字符串。 - 多次出现,包括在开头、中间、结尾。 - 子字符串包含特殊正则字符的情况,比如"."或者"*"等。 在split方法中,必须使用Pattern.quote(subStr)来转义子字符串中的特殊字符,否则会抛出异常或得到错误结果。 例如,当subStr是"."时,split(".")会把字符串按任意字符分割,导致错误。因此必须使用Pattern.compile(Pattern.quote(subStr))或者split(Pattern.quote(subStr))。 因此,在split方法的代码中,应该这样写: String[] parts = str.split(Pattern.quote(subStr), -1); 这样才能正确分割。 因此,在回答用户的问题时,应该提供几种方法,并说明它们的区别,尤其是是否处理重叠的情况,以及如何处理正则表达式中的特殊字符。 最后,还需要考虑效率问题。对于较大的字符串,不同的方法可能有不同的性能表现。例如,使用indexOf的方法可能更高效,因为直接操作字符串,而split方法可能需要创建数组,正则表达式可能有额外的开销。 综上,回答的结构应该是: 1. 问题分析:统计子字符串出现的次数,考虑是否重叠。 2. 方法一:使用indexOf的非重叠统计。 3. 方法二:使用indexOf允许重叠的统计。 4. 方法三:使用split方法(注意转义)。 5. 方法四:使用正则表达式Matcher。 6. 说明各种方法的适用场景,注意事项(如处理字符串、特殊字符等)。 7. 提供示例代码,并测试案例。 例如,用户需要统计"ababab"中"ab"的次数,结果应为3次。在重叠的情况下,如"aaaa"中"aa",非重叠得到2次,重叠得到3次。 最后,提醒用户注意输入的有效性检查,如子字符串为空的情况,避免程序出错。</think>要统计一个字符串中特定子字符串的出现次数,可以采用以下几种方法。以下将分步骤介绍每种方法的实现及其适用场景。 --- ### **方法一:使用 `indexOf` 方法(非重叠统计)** 此方法通过循环查找子字符串的位置,每次跳过已找到的子字符串长度,避免重叠。 ```java public static int countOccurrences(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty() || subStr.length() > str.length()) { return 0; } int count = 0; int index = 0; while (index <= str.length() - subStr.length()) { int foundIndex = str.indexOf(subStr, index); if (foundIndex == -1) { break; } count++; index = foundIndex + subStr.length(); // 跳过当前子字符串长度 } return count; } ``` **示例**: - `countOccurrences("ababab", "ab")` 返回 `3`。 - `countOccurrences("aaaa", "aa")` 返回 `2`(非重叠)。 --- ### **方法二:允许重叠的统计** 若需统计重叠出现的次数,每次仅移动一个字符: ```java public static int countOverlapping(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty() || subStr.length() > str.length()) { return 0; } int count = 0; int index = 0; while (index <= str.length() - subStr.length()) { int foundIndex = str.indexOf(subStr, index); if (foundIndex == -1) { break; } count++; index = foundIndex + 1; // 仅移动一个字符 } return count; } ``` **示例**: - `countOverlapping("aaaa", "aa")` 返回 `3`(允许重叠)。 --- ### **方法三:使用 `split` 方法** 通过分割字符串统计次数,注意处理正则表达式中的特殊字符: ```java import java.util.regex.Pattern; public static int countWithSplit(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty()) { return 0; } String[] parts = str.split(Pattern.quote(subStr), -1); // 转义特殊字符 return parts.length - 1; } ``` **示例**: - `countWithSplit("ababab", "ab")` 返回 `3`。 - `countWithSplit("a.b.c", ".")` 正确处理特殊字符,返回 `2`。 --- ### **方法四:正则表达式匹配** 使用 `Matcher` 类查找所有匹配项: ```java import java.util.regex.*; public static int countWithRegex(String str, String subStr) { if (subStr.isEmpty() || str.isEmpty()) { return 0; } Pattern pattern = Pattern.compile(Pattern.quote(subStr)); // 转义特殊字符 Matcher matcher = pattern.matcher(str); int count = 0; while (matcher.find()) { count++; } return count; } ``` **示例**: - `countWithRegex("ababab", "ab")` 返回 `3`。 --- ### **注意事项** 1. **空字符串处理**:子字符串为空或长度大于源字符串时,直接返回 `0`。 2. **特殊字符**:若子字符串包含正则元字符(如 `.`、`*`),需用 `Pattern.quote()` 转义。 3. **性能**:`indexOf` 方法效率较高,适合处理大文本。 --- ### **测试用例** ```java public static void main(String[] args) { System.out.println(countOccurrences("ababab", "ab")); // 3 System.out.println(countOverlapping("aaaa", "aa")); // 3 System.out.println(countWithSplit("a.b.c", ".")); // 2 System.out.println(countWithRegex("hello$$world", "$")); // 2 } ``` 根据需求选择合适的方法,注意是否需要重叠统计及特殊字符处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值