Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我在java中使用模式和匹配器,如何找到匹配数?_Java - Fatal编程技术网

如果我在java中使用模式和匹配器,如何找到匹配数?

如果我在java中使用模式和匹配器,如何找到匹配数?,java,Java,我有以下代码 Pattern keyPattern = Pattern.compile(key); Matcher matcher = keyPattern.matcher(str); return matcher.replaceAll(value); 这将用value替换str中的键; 但我想知道有多少key的实例被value替换了。 那么如何知道呢?您可以在循环中使用find方法进行计数。下面是一个例子: 在调用find时,您可以同时收集字符串的各个部分,并在一个函

我有以下代码

    Pattern keyPattern = Pattern.compile(key);
    Matcher matcher = keyPattern.matcher(str);
    return matcher.replaceAll(value);
这将用value替换str中的键; 但我想知道有多少key的实例被value替换了。
那么如何知道呢?

您可以在循环中使用find方法进行计数。下面是一个例子:

在调用find时,您可以同时收集字符串的各个部分,并在一个函数中手动生成结果。或者,如果性能不是问题,您可以先计数,然后使用replaceAll再次扫描字符串。

相反,您可以执行以下操作:

int num = 0;
Pattern keyPattern = Pattern.compile(key);
Matcher matcher = keyPattern.matcher(str);
while(matcher.find()){
    str = matcher.replaceFirst();
    matcher = keyPattern.matcher(str); //don't know if this line is necessary
    num++;
}

以上答案可能更好。同意。首先,您的解决方案每次都必须从头开始重新扫描。其次,如果(例如)替换字符串包含与键模式匹配的内容,它将给出错误的答案;从while循环,它应该可以工作,对吗?没有循环,我可以一次找到。因为它可能会降低性能。即使有一个函数可以在不循环的情况下调用,但在内部它仍然会有一个循环,所以我认为性能不会有显著的提高。我在上面概述的第一种方法应该可以提供良好的性能,因为字符串只扫描一次。
int num = 0;
Pattern keyPattern = Pattern.compile(key);
Matcher matcher = keyPattern.matcher(str);
while(matcher.find()){
    str = matcher.replaceFirst();
    matcher = keyPattern.matcher(str); //don't know if this line is necessary
    num++;
}