Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Regex - Fatal编程技术网

创建可重用的Java匹配器

创建可重用的Java匹配器,java,regex,Java,Regex,我从中了解到,如果我处于单线程上下文中,最好重用匹配器 假设我有一个使用File.list(basePath)的路径流,我想根据它们的文件名与正则表达式的匹配来过滤它们。似乎我应该为流中的每个路径文件名使用matcher.reset(filename)。太好了 但是我如何初始化匹配器,以便可以重用它,而不必首先创建它并与某些东西进行匹配?因为我不知道第一个“某物”是什么——我甚至不知道是否会有“某物”(例如某个目录中的文件) 我这样做是为了让事情开始吗 final Matcher filenam

我从中了解到,如果我处于单线程上下文中,最好重用
匹配器

假设我有一个使用
File.list(basePath)
的路径流,我想根据它们的文件名与正则表达式的匹配来过滤它们。似乎我应该为流中的每个路径文件名使用
matcher.reset(filename)
。太好了

但是我如何初始化
匹配器
,以便可以重用它,而不必首先创建它并与某些东西进行匹配?因为我不知道第一个“某物”是什么——我甚至不知道是否会有“某物”(例如某个目录中的文件)

我这样做是为了让事情开始吗

final Matcher filenamePatternMatcher=filenamePattern.matcher("");
这看起来既麻烦又浪费。但是,如果我将
filenamePatternMatcher
设置为
null
,我将不得不在处理单个文件时执行不必要的检查,例如:

if((filenamePatternMatcher!=null
    ? filenamePatternMatcher.reset(filename)
    : filenamePattern.matcher(filename)).matches) {…}
此外,我甚至不能在
流中这样做,因为匹配器必须是最终的


那么,使用
matcher.reset()?Java API创建者没有想到这个用例吗?

我对一些经常进行的文件名匹配进行了一些计时,调用
Matcher.reset(String)
将匹配速度提高了约20%/减少了使用的内存

幸运的是,
Matcher.reset()
返回
,以便于在流过滤器中引用,尽管在使用前设置空白的Matcher似乎有点浪费,但值得尝试更改:

stream.filter(s -> pattern.matcher(s).matches())
。。。要使用额外的行初始化匹配器:

Matcher matcher = pattern.matcher("");
stream.filter(s -> matcher.reset(s).matches())