java - 查找子字符串出现的总数

标签 java regex

假设我想查找以下子字符串的出现总数。

以 1 开头,后跟任意(0 个或更多)个 0,然后是 1 的任何子字符串。

我为它构造了一个正则表达式:1[0]*1

然后我使用java的PatternMatcher类来完成剩下的工作。

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/

相关文章:

java - 滚动 JPanel

regex - 使用 match 在只有 bash 的字符串中查找子字符串

正则表达式如何匹配 dd mmm yyyy 以仅选择年份的前两位数字

php - 将两个正则表达式合并为一个,匹配 URL 的第一部分和最后一部分?

java - IntelliJ Idea 不创建 manifest.mf、pom.xml、pom.properties

java - 未处理的异常的输出与程序的输出混淆

java - 无法在 Vista Business 上执行 Java 应用程序 - "Cannot find the main class... Program will exit"

java - RuntimeException 导致 200 OK 状态

regex - 检查字符串中某个字符是否多次出现

python - 正则表达式——不同字符串相同匹配