当前位置: 首页 > 面试题库 >

Java正则表达式匹配计数

戚阳
2023-03-14
问题内容

假设我有一个文件,该文件包含以下内容:

HelloxxxHelloxxxHello

我编译一个模式以查找“ Hello”

Pattern pattern = Pattern.compile("Hello");

然后,我使用inputstream读取文件并将其转换为String,以便可以对其进行正则表达式处理。

匹配器在文件中找到匹配项后,就会进行指示,但不会告诉我找到了多少个匹配项。只是它在字符串中找到了一个匹配项。

因此,由于字符串相对较短,并且我正在使用的缓冲区为200个字节,因此它应该找到三个匹配项。但是,它只是简单地说“比赛”,而没有提供给我多少比赛的计数。

计算字符串中发生的匹配数的最简单方法是什么。我已经尝试过各种for循环并使用matcher.groupCount(),但是速度却很快。


问题答案:

matcher.find()找不到所有匹配项,仅找到下一个匹配项。

你必须执行以下操作:

int count = 0;
while (matcher.find())
    count++;

顺便说一句,matcher.groupCount()是完全不同的东西。

完整的例子:

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String hello = "HelloxxxHelloxxxHello";
        Pattern pattern = Pattern.compile("Hello");
        Matcher matcher = pattern.matcher(hello);

        int count = 0;
        while (matcher.find())
            count++;

        System.out.println(count);    // prints 3
    }
}

Handling overlapping matches

当计算上述片段aa中aaaa的时,将为你提供2。

aaaa
aa
  aa

要获得3个匹配项,即此行为:

aaaa
aa
 aa
  aa

你必须在索引处搜索匹配项,<start of last match> + 1如下所示:

String hello = "aaaa";
Pattern pattern = Pattern.compile("aa");
Matcher matcher = pattern.matcher(hello);

int count = 0;
int i = 0;
while (matcher.find(i)) {
    count++;
    i = matcher.start() + 1;
}

System.out.println(count);    // prints 3


 类似资料:
  • 问题内容: 当字符串以数字开头时,我需要匹配,然后是一个点,然后是一个空格和1个或多个大写字符。匹配必须发生在字符串的开头。我有以下字符串。 我尝试过的正则表达式是: 它不匹配。一个有效的正则表达式将对这个问题有什么作用? 问题答案: (对不起,我先前的错误。大脑现在坚定地投入了。嗯,也许。) 这有效: 分解: =字符串开头 =一个或多个数字 (之所以转义,是因为它在字符串中,因此) =文字(或者

  • 问题内容: 我从以下格式的文件中获取输入: 现在,我想在我的Java代码中读取int1,int2,int3和int4。我该如何在Java中使用正则表达式匹配。谢谢。 问题答案: 为了避免空值:

  • 我们得到了一些这样的内容:

  • 有没有人试图描述与正则表达式匹配的正则表达式? 由于重复的关键字,这个主题几乎不可能在网上找到。 它可能在实际应用程序中不可用,因为支持正则表达式的语言通常具有解析它们的方法,我们可以将其用于验证,以及一种在代码中分隔正则表达式的方法,可用于搜索目的。 但是我仍然想知道匹配所有正则表达式的正则表达式是什么样子的。应该可以写一个。

  • 问题内容: 我正在使用模块中的函数来匹配某些东西,并且一切正常。 现在,我需要找出我有多少场比赛。是否可以不两次遍历迭代器?(先找出计数然后是真正的迭代) 一些代码: 一切正常,我只需要在循环之前获取匹配数即可。 问题答案: 如果您知道需要所有匹配项,则可以使用该功能。它将返回所有匹配项的列表。然后,您可以只进行匹配次数。