假设我想查找以下子字符串的总出现次数.
任何以1开头的子字符串,后跟任意(0或更多)0的数字,然后是1.
我为它形成了一个正则表达式: 1[0]*1
然后我用了Pattern和Matcher类的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);
}
}
Run Code Online (Sandbox Code Playgroud)
但问题是当我们有两个重叠的连续子串时,上面的代码输出比实际出现次数少1.例如,在上面的代码输出是2,而它应该是3.我可以修改上面的代码以返回正确的输出.
使用积极的前瞻:
"10*(?=1)"
Run Code Online (Sandbox Code Playgroud)
这与您描述的相同模式匹配(以1开头,后跟零或更多0,后跟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);
Run Code Online (Sandbox Code Playgroud)
根据需要输出3.