Java 对每个组合中出现的子字符串进行计数
我有一个字符串Java 对每个组合中出现的子字符串进行计数,java,regex,Java,Regex,我有一个字符串phahahahoto,我需要找出该字符串haha在上面的字符串中出现了多少次。如果你仔细看,它会出现两次。 下面是我的代码,我得到的是输出1而不是2 代码是用java编写的 Pattern pattern = Pattern.compile("haha"); Matcher matcher = pattern.matcher("phahahahoto"); int count = 0; while (matcher.find()) { count++; } System.
phahahahoto
,我需要找出该字符串haha
在上面的字符串中出现了多少次。如果你仔细看,它会出现两次。
下面是我的代码,我得到的是输出1而不是2
代码是用java编写的
Pattern pattern = Pattern.compile("haha");
Matcher matcher = pattern.matcher("phahahahoto");
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println(count);
使用lookaheads进行重叠匹配。如果您清楚地注意到字符串
haha
重叠。如果将haha
作为正则表达式传递,它将不会进行重叠匹配,因为模式haha
匹配第一个haha
子字符串,只剩下最后一个ha
部分。Lookarounds不会使用任何单个字符。因此,它只能匹配边界
Pattern pattern = Pattern.compile("(?=haha)");
Matcher matcher = pattern.matcher("phahahahoto");
int count = 0;
while (matcher.find()) {
count++;
}
System.out.println(count);
这里它与每个
haha
之前存在的边界匹配。请参阅上面的演示链接。您可以在一行中获得计数,如下所示:
int count = "phahahahoto".split("(?=haha)").length - 1;
//=> 2
可能您应该在循环条件中使用
find(int offset)
方法和lastMatchStart+1
。(int lastMatchStart=-1
用于初始化。)