假设我想查找以下子字符串的总出现次数。
以1开头的任何子字符串,后跟任意(0或更多)数字的0'然后是1。
我为它形成了一个正则表达式:1[0]*1
然后我使用java的Pattern
和Matcher
类来完成剩下的工作。
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.我可以修改上面的代码以返回正确的输出。
答案 0 :(得分:6)
"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.