一个字符串包含另一个字符串的次数

8
如主题所述,如何检查一个字符串包含另一个字符串的次数? 例如:
s1 "babab"
s2 "bab" 
Result : 2

如果我使用Matcher,它只会识别第一个匹配:
String s1 = JOptionPane.showInputDialog(" ");
String s2 = JOptionPane.showInputDialog(" ");
Pattern p = Pattern.compile(s2);
Matcher m = p.matcher(s1);
int  counter = 0;
while(m.find()){
    System.out.println(m.group());
    counter++;
}
System.out.println(counter);

我可以这样做,但是我希望下面使用Java库如Scanner,StringTokenizer,Matcher等:
String s1 = JOptionPane.showInputDialog(" ");
String s2 = JOptionPane.showInputDialog(" ");
String pom;
int count = 0;
for(int  i = 0 ; i< s1.length() ; i++){
    if(s1.charAt(i) == s2.charAt(0)){
        if(i + s2.length() <= s1.length()){
            pom = s1.substring(i,i+s2.length());
            if(pom.equals(s2)){
                count++;
            }
        }
    }
 }

 System.out.println(count);

这是一项作业任务吗? - Adam Arold
3
你可以简单地使用String#indexOf()在while循环中,从上一次找到的索引位置开始搜索。 - assylias
1
https://dev59.com/_HRA5IYBdhLWcg3w9ivq - Vladimir Kravets
5个回答

4

为了好玩,这里提供一行代码解决方案。

longStr是输入的字符串,findStr是要搜索的字符串。除了必须确保longStrfindStr不为空且findStr至少有一个字符外,没有其他假设。

longStr.length() - longStr.replaceAll(Pattern.quote(findStr.substring(0,1)) + "(?=" + Pattern.quote(findStr.substring(1)) + ")", "").length()

由于只要两个匹配项在不同的索引处开始,就被认为是不同的匹配项,并且可以出现重叠,因此我们需要一种方法来区分匹配项并允许匹配部分重叠。

关键是仅消耗搜索字符串的第一个字符,并使用前瞻断言来断定搜索字符串的其余部分。这允许重叠部分重新匹配,并通过删除匹配的第一个字符来计算匹配次数。


这是如何工作的?我不理解Pattern.quote方法,什么是字面正则表达式? - MOnasz
这意味着即使字符串包含可以识别为正则表达式的字符或序列,它们也会被中和为普通字符。 - nhahtdh

2

如果您知道字符串中要查找的单词,那么这可能会起作用,但您可能需要编辑正则表达式模式。

String string = "hellohellohellohellohellohello";
Pattern pattern = Pattern.compile("hello"); 
Matcher matcher = pattern.matcher(string);
int count = 0;
while (matcher.find()) count++;

对于字符串 babab 和模式 bab,计数为 1 - mtk
你能运行一下针对"bababab"的程序并查看结果吗?如果结果为2,则该模式会丢弃已经找到的子串。我认为它所做的是"bab-ab",已经找到一个子串,所以这可能不是最适合你的选择。 - czioutas
也许这样会更好(没有测试过,是在记事本中编写的,所以要小心:D)String text = "babab"; String matchWord = "bab"; String newWord = ""; char[] chars = text.split(""); int counter;for(int j=0; j<chars.length; j++) { if(j < chars.length - 3) { newWord = chars[j] + chars[j+1] + chars[j+2]; if(newWord.equals(matchWord)) { counter++; } } } - czioutas

1

你可以这样做

private int counterString(String s,String search) {
    int times = 0;
    int index = s.indexOf(search,0);
    while(index > 0) {
        index = s.indexOf(search,index+1);
        ++times;
    }
    return times;
 }

1

Matcher类有两个方法"start"和"end",它们返回最后匹配的起始索引和结束索引。此外,方法find有一个可选参数"start",用于指定开始搜索的位置。


0

一些快速的布鲁斯·福特解决方案:

    String someString = "bababab";
    String toLookFor = "bab";
    int count = 0;
    for (int i = 0; i < someString.length(); i++) {
        if (someString.length() - i >= toLookFor.length()) {
            if (someString.substring(i, i + toLookFor.length()).equals(toLookFor) && !"".equals(toLookFor)) {
                count++;
            }
        }
    }
    System.out.println(count);

这将打印出3。请注意,我假设没有任何一个String是null。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接