知道如果String在Java中包含相同的序列

时间:2014-04-24 01:36:32

标签: java string

确定首先我想知道有多少次我可以找到这个世界,例如“懒惰”

String string1= "The quick brown fox jumps over the lazy dog";
String string2= "The lazy brown fox jumps over the lazy dog";

我知道使用Java String.contains会处理两个字符串,但我怎么知道在第一个字符串中它是否包含1个“懒”字,而在第二个字符串2中是“懒”字,因为它包含它是一个布尔值方法,所以在这种情况下,这不是我需要的。

我想知道如何在不使用正则表达式的情况下执行此操作,因为我正在学习如何创建正则表达式引擎。

4 个答案:

答案 0 :(得分:3)

这可以通过一个非常简单的正则表达式一次完成。当然,你也可以抽象它并使它整洁干净。

Pattern p = Pattern.compile("lazy");
int occurences;
Matcher m = p.matcher(string1); //etc
while(m.find())
    occurences++;

答案 1 :(得分:1)

有许多可能的解决方案,但有一种方法是进行线性搜索并计算您看到它的次数。代码看起来像这样。

int countOccurences(String haystack, String needle) {
    int count = 0;
    for (int i = 0; i < haystack.length() - needle.length(); i++) 
       if (haystack.substring(i, i + needle.length()).equals(needle)) count++;

    return count;
}

答案 2 :(得分:0)

这是一个更加诺贝尔友好的方法:

public class Yolo {

    public static void main(String[] args) {
        String string1= "The quick brown fox jumps over the lazy dog";
        String string2= "The lazy brown fox jumps over the lazy dog";
        String sx1[] = string1.split("\\ ");
        String sx2[] = string2.split("\\ ");
        int count = 0;
        for (int i = 0; i < sx1.length; i++) {
            if (sx1[i].equalsIgnoreCase("lazy")) {
                count++;
            }
        }
        for (int i = 0; i < sx2.length; i++) {
            if (sx2[i].equalsIgnoreCase("lazy")) {
                count++;
            }
        }
        System.out.println("Num occurances of lazy = "+count);

    }

}

答案 3 :(得分:0)

来自Wikipedia的引文:

  

正则表达式处理器将正则表达式转换为   然后制作非确定性有限自动机(NFA)   确定性并在目标文本字符串上运行以识别   与正则表达式匹配的子字符串。

如果您真的想要制作正则表达式引擎,那么您应该了解一般的状态机,语法和编译器。这非常艰难,所以如果你想通过搜索子串开始,那么这样做可能会更好。

非常粗略地说,如果你构建一个状态机来搜索子字符串,例如对于“懒惰”这个词来说,它看起来像这样:

  • 状态机将有5种状态:
    • “找不到”
    • “找到L”
    • “找到洛杉矶”
    • “找到LAZ”
    • “找到了LAZY”
  • 读完一个角色后,移动到适当的状态
    • e.g。如果您处于“未找到”并且您阅读 L ,请转到“找到L”状态
    • e.g。如果您在“找到LAZ”并且您阅读 Y ,请转到“找到LAZY”状态
    • e.g。如果您在“找到LAZ”并且您阅读 $ ,请转到“未找到”状态
  • 如果您处于“已找到LAZY”状态,请递增计数器并返回“未找到”状态

状态自动机执行此操作的优点和要点并非如此,您只需要遍历字符串一次即可执行搜索。