string中子string的出现

为什么下面的algorithm不能停止我? (str是我正在search的string,findStr是我正在尝试查找的string)

String str = "helloslkhellodjladfjhello"; String findStr = "hello"; int lastIndex = 0; int count = 0; while (lastIndex != -1) { lastIndex = str.indexOf(findStr,lastIndex); if( lastIndex != -1) count++; lastIndex += findStr.length(); } System.out.println(count); 

编辑 – 更新,仍然无法正常工作

最后一行是创build一个问题。 lastIndex永远不会在-1,所以会有一个无限循环。 这可以通过将最后一行代码移动到if块来解决。

 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; int lastIndex = 0; int count = 0; while(lastIndex != -1){ lastIndex = str.indexOf(findStr,lastIndex); if(lastIndex != -1){ count ++; lastIndex += findStr.length(); } } System.out.println(count); 

如何使用Apache Commons Lang的StringUtils.countMatches ?

 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; System.out.println(StringUtils.countMatches(str, findStr)); 

输出:

 3 

你的lastIndex += findStr.length(); 被放置在括号外,导致无限循环(当没有发现时,lastIndex始终是findStr.length() )。

这里是固定版本:

 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; int lastIndex = 0; int count = 0; while (lastIndex != -1) { lastIndex = str.indexOf(findStr, lastIndex); if (lastIndex != -1) { count++; lastIndex += findStr.length(); } } System.out.println(count); 

你真的必须自己处理匹配吗? 特别是如果你所需要的只是出现的次数,正则expression式是整齐的:

 String str = "helloslkhellodjladfjhello"; Pattern p = Pattern.compile("hello"); Matcher m = p.matcher(str); int count = 0; while (m.find()){ count +=1; } System.out.println(count); 

较短的版本。 ;)

 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; System.out.println(str.split(findStr, -1).length-1); 
 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; int lastIndex = 0; int count = 0; while((lastIndex = str.indexOf(findStr, lastIndex)) != -1) { count++; lastIndex += findStr.length() - 1; } System.out.println(count); 

在循环结束时计数为3; 希望它有帮助

许多给定的答案在以下一个或多个方面失败:

  • 任意长度的模式
  • 重叠的匹配项(如“23232”中的“232”或“aaa”中的“aa”)
  • 正则expression式元字符

这是我写的:

 static int countMatches(Pattern pattern, String string) { Matcher matcher = pattern.matcher(string); int count = 0; int pos = 0; while (matcher.find(pos)) { count++; pos = matcher.start() + 1; } return count; } 

示例调用:

 Pattern pattern = Pattern.compile("232"); int count = countMatches(pattern, "23232"); // Returns 2 

如果你想要一个非正则expression式的search,只需用LITERAL标志适当地编译你的模式:

 Pattern pattern = Pattern.compile("1+1", Pattern.LITERAL); int count = countMatches(pattern, "1+1+1"); // Returns 2 

这是一个很好的可重用的方法:

 public static int count(String text, String find) { int index = 0, count = 0, length = find.length(); while( (index = text.indexOf(find, index)) != -1 ) { index += length; count++; } return count; } 

每当你寻找下一个事件时增加lastIndex

否则,它总是find第一个子string(位置0)。

 public int indexOf(int ch, int fromIndex) 

返回指定字符首次出现的string中的索引,开始在指定索引处进行search。

所以你的lastindex值总是为0,它总是在string中findhello

 public int countOfOccurrences(String str, String subStr) { return (str.length() - str.replaceAll(Pattern.quote(subStr), "").length()) / subStr.length(); } 

尝试将lastIndex+=findStr.length()到循环的结尾,否则最终会处于无限循环,因为一旦find了子string,就试图从最后一个位置一次又一次地find它。

试试这个。 它用-代替所有的比赛。

 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; int numberOfMatches = 0; while (str.contains(findStr)){ str = str.replaceFirst(findStr, "-"); numberOfMatches++; } 

如果你不想破坏你的str你可以使用相同的内容创build一个新的string:

 String str = "helloslkhellodjladfjhello"; String strDestroy = str; String findStr = "hello"; int numberOfMatches = 0; while (strDestroy.contains(findStr)){ strDestroy = strDestroy.replaceFirst(findStr, "-"); numberOfMatches++; } 

执行这个块之后,这些将是你的值:

 str = "helloslkhellodjladfjhello" strDestroy = "-slk-djladfj-" findStr = "hello" numberOfMatches = 3 

给出的答案是正确的,对于计算线路回报这样的东西并不好,而且太冗长了。 后来的答案是更好的,但都可以简单地与

 str.split(findStr).length 

它不会使用问题中的示例删除尾随匹配项。

正如@Mr_and_Mrs_D所示:

 String haystack = "hellolovelyworld"; String needle = "lo"; return haystack.split(Pattern.quote(needle), -1).length - 1; 

基于现有的答案,我想添加一个“更短”的版本,如果没有:

 String str = "helloslkhellodjladfjhello"; String findStr = "hello"; int count = 0, lastIndex = 0; while((lastIndex = str.indexOf(findStr, lastIndex)) != -1) { lastIndex += findStr.length() - 1; count++; } System.out.println(count); // output: 3 

您可以使用内置的库函数的出现次数:

 import org.springframework.util.StringUtils; StringUtils.countOccurrencesOf(result, "R-") 

这下面的方法显示在整个string上重复多less次的子string。 希望对你充分使用: –

  String search_pattern="aaa"; String whole_pattern=""aaaaaababaaaaaa; int j = search_pattern.length(); for (int i = 0; i < whole_pattern.length() - j + 1; i++) { String str1 = whole_pattern.substring(i, j + i); System.out.println("sub string loop " + i + " => " + str1); if (str1.equals(search_pattern)) { Constants.k++; } } 

这里是另一个解决scheme,而不使用正则expression式/模式/匹配器,甚至不使用StringUtils。

 String str = "helloslkhellodjladfjhelloarunkumarhelloasdhelloaruhelloasrhello"; String findStr = "hello"; int count =0; int findStrLength = findStr.length(); for(int i=0;i<str.length();i++){ if(findStr.startsWith(Character.toString(str.charAt(i)))){ if(str.substring(i).length() >= findStrLength){ if(str.substring(i, i+findStrLength).equals(findStr)){ count++; } } } } System.out.println(count); 

如果你需要在原始string中的每个子string的索引,你可以用indexOf做这样的事情:

  private static List<Integer> getAllIndexesOfSubstringInString(String fullString, String substring) { int pointIndex = 0; List<Integer> allOccurences = new ArrayList<Integer>(); while(fullPdfText.indexOf(substring,pointIndex) >= 0){ allOccurences.add(fullPdfText.indexOf(substring, pointIndex)); pointIndex = fullPdfText.indexOf(substring, pointIndex) + substring.length(); } return allOccurences; } 

以下是用于统计用户inputstring中令牌出现次数的高级版本:

 public class StringIndexOf { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("Enter a sentence please: \n"); String string = scanner.nextLine(); int atIndex = 0; int count = 0; while (atIndex != -1) { atIndex = string.indexOf("hello", atIndex); if(atIndex != -1) { count++; atIndex += 5; } } System.out.println(count); } } 

我不敢相信没有人提过这个class轮。 它简单,简洁,比str.split(target, -1).length-1

 public static int count(String str, String target) { return (str.length() - str.replace(target, "").length()) / target.length(); }