2015-09-28 67 views
2

假设我想查找后面子字符串的总次数。查找子字符串的总次数

与1后跟任意(0或更多)数量的0的启动,然后接着1.

我形成为它正则表达式的任何字符串:1[0]*1

然后我使用的PatternMatcher java类做剩下的工作。

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.我可以修改上述代码返回正确的输出。

回答

6

使用positive lookahead

"10*(?=1)" 

此相同的图案像你描述匹配(从1开始,接着是零个或多个O,随后1),但不同的是,最后的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。

相关问题