确定首先我想知道有多少次我可以找到这个世界,例如“懒惰”
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中是“懒”字,因为它包含它是一个布尔值方法,所以在这种情况下,这不是我需要的。
我想知道如何在不使用正则表达式的情况下执行此操作,因为我正在学习如何创建正则表达式引擎。
答案 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) 确定性并在目标文本字符串上运行以识别 与正则表达式匹配的子字符串。
如果您真的想要制作正则表达式引擎,那么您应该了解一般的状态机,语法和编译器。这非常艰难,所以如果你想通过搜索子串开始,那么这样做可能会更好。
非常粗略地说,如果你构建一个状态机来搜索子字符串,例如对于“懒惰”这个词来说,它看起来像这样:
状态自动机执行此操作的优点和要点并非如此,您只需要遍历字符串一次即可执行搜索。