创建可重用的Java Matcher

时间:2018-10-06 14:44:26

标签: java regex

Java Pattern Matcher: create new or reset?我了解到,如果我在单线程上下文中,最好重用Matcher

因此,假设我有一个使用File.list(basePath)的路径流,并且我想根据与正则表达式匹配的文件名来过滤它们。看来我应该对流中的每个路径文件名使用matcher.reset(filename)。很棒。

但是如何初始化Matcher,以便可以重用它而无需先创建它并与之匹配?因为我不知道第一个“东西”是什么-我什至不知道是否会有“东西”(例如某个目录中的文件)。

那么我要这样做吗?

final Matcher filenamePatternMatcher=filenamePattern.matcher("");

这看起来既麻烦又浪费。但是,如果我将filenamePatternMatcher设置为null,则将不得不进行不必要的检查来处理各个文件,例如:

if((filenamePatternMatcher!=null
    ? filenamePatternMatcher.reset(filename)
    : filenamePattern.matcher(filename)).matches) {…}

此外,我什至无法在Stream<Path>内执行此操作,因为匹配器必须有效地是最终的。

那么,创建匹配器以稍后使用Matcher.reset()与字符串进行匹配的一种优雅方法是什么? Java API创建者是否没有想到此用例?

1 个答案:

答案 0 :(得分:0)

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

幸运的是,Matcher.reset()返回this使其易于在流过滤器中进行引用,尽管在使用前设置空白匹配器似乎有些浪费,但值得将其更改为:

stream.filter(s -> pattern.matcher(s).matches())

...有多余的行来初始化Matcher:

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