java - 在 java 中将 "aa"与 "aaaa"匹配会返回 2——我希望它是 3

标签 java regex pattern-matching

我正在尝试理解 Java 中的模式匹配。然而,我对下面代码的输出感到困惑。它在将“aa”与“aaaa”匹配时打印计数为 2,但我希望它打印 3,因为“a”后跟“a”在给定字符串中出现三次。有人能解释一下这里有什么问题吗?

Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aaaa");
int count = 0;
while(m.find())
  count++;
System.out.println(count);

最佳答案

匹配器不会找到重叠的匹配项。因此,由于第一个匹配项是在索引 0 处找到的,长度为 2,因此直到索引 2 时才会开始查找下一个匹配项,并且不会找到从索引 1 开始的潜在匹配项。

如果您想查找重叠的匹配项,您可以使用m.find(start),其中start是比上一个匹配项高1的索引。例如:

Pattern p = Pattern.compile("aa");
Matcher m = p.matcher("aaaa");
int count = 0;
int start = 0;
while(m.find(start)) {
  count++;
  start = m.start() + 1;
}
System.out.println(count);

关于java - 在 java 中将 "aa"与 "aaaa"匹配会返回 2——我希望它是 3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22726243/

相关文章:

java - 将 JS 与 wicket 集成

java - 错误解决版本为 'org.apache.maven.plugins:maven-eclipse-plugin' : Plugin requires Maven version 2. 2.1

java - 查找二叉树节点有序排序的高效算法

python - 修剪数据集词汇

regex - 模式匹配并使用 sed 在文本文件中的行尾或行首添加行

Java-调用方法实例的问题?

java - java中使用正则表达式捕获变量

ios - 我必须使用正则表达式来提取消息还是有属性?

bash - 从 Bash 中的字符串中删除固定前缀/后缀

ios - 如何匹配两个语音文件并返回是否是同一个词?