Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对每个组合中出现的子字符串进行计数_Java_Regex - Fatal编程技术网

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
用于初始化。)