2015-09-28 69 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。

相關問題