假设我想查找以下子字符串的出现总数。
以 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。我可以修改上面的代码以返回正确的输出吗。
最佳答案
使用 positive lookahead :
"10*(?=1)"
这与您描述的模式匹配(以 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);
根据需要输出 3。
关于java - 查找子字符串出现的总数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32816457/