10

我知道这已被问到,但我无法解决它

对于带有正文的书本对象(西班牙语):("quiero mas dinero"实际上要长一些)

我的Matcher不断返回 0:

    String s="mas"; // this is for testing, comes from a List<String>
    int hit=0;
    Pattern p=Pattern.compile(s,Pattern.CASE_INSENSITIVE);
    Matcher m = p.matcher(mybooks.get(i).getBody());
    m.find();
    System.out.println(s+"  "+m.groupCount()+"  " +mybooks.get(i).getBody());
    hit+=m.groupCount();

我一直"mas 0 quiero mas dinero"在控制台上。为什么哦为什么?

4

4 回答 4

11

Matcher.groupCount()的 javadoc :

返回此匹配器模式中的捕获组数。
按照惯例,零组表示整个模式。它不包括在此计数中。

如果您从中检查返回值,m.find()则返回truem.group()返回mas,那么匹配器确实找到了匹配项。

如果您要做的是计算sin的出现次数mybooks.get(i).getBody(),您可以这样做:

String s="mas"; // this is for testing, comes from a List<String>
int hit=0;
Pattern p=Pattern.compile(s,Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(mybooks.get(i).getBody());
while (m.find()) {
    hit++;
}
于 2012-09-13T20:09:50.083 回答
2

然后我怎么能在不循环的情况下找到字符串中“mas”(或任何其他)单词的数量?

您可以在 Apache Commons 中使用StringUtils :

int countMatches = StringUtils.countMatches("quiero mas dinero...", "mas");
于 2012-09-13T20:19:00.533 回答
0

您可以在正则表达式中添加括号,然后在您的示例中为“(mas)”。

于 2014-07-17T10:28:52.257 回答
0

您可以在正则表达式中添加括号,然后在您的示例中为“(mas)”。

这种方式不适合这个任务。它显示捕获组的数量包含 Matcher m 的结果。在这种情况下,即使对于像“mas mas”这样的输入文本的模式是“(mas)”,m.groupcount() 也会显示 1 - 一个且只有两个匹配项的组。

因此,第一个响应是正确的,并且唯一可能用于匹配计数。

于 2017-10-04T08:10:30.123 回答