查找子字符串的总出现次数

时间:2015-09-28 05:54:12

标签: java regex

假设我想查找以下子字符串的总出现次数。

以1开头的任何子字符串,后跟任意(0或更多)数字的0'然后是1。

我为它形成了一个正则表达式:1[0]*1

然后我使用java的PatternMatcher类来完成剩下的工作。

import java.util.regex.*;
class P_m
{
 public static void main(String []args)
 {
     int s=0;
     Pattern p=Pattern.compile("1[0]*1");
     Matcher matcher=p.matcher("1000010101");
     while(matcher.find())
      ++s;
     System.out.println(s);
 }
}

但问题是当我们有两个重叠的连续子串时,上面的代码输出比实际出现次数少1。例如,在上面的代码输出是2,而它应该是3.我可以修改上面的代码以返回正确的输出。

1 个答案:

答案 0 :(得分:6)

使用positive lookahead

"10*(?=1)"

这匹配您描述的相同模式(以1开头,后跟零或更多0,后跟1),但不同之处在于最后的1不包含在匹配中。这样,最后一个不被消费"通过比赛,它可以参与进一步的比赛,有效地允许你要求的重叠。

Pattern p = Pattern.compile("10*(?=1)");
Matcher matcher = p.matcher("1000010101");
int s = 0;
while (matcher.find()) ++s;
System.out.println(s);

根据需要输出3.