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(); }