【问题标题】:create reusable Java Matcher创建可重用的 Java Matcher
【发布时间】:2019-03-11 19:41:15
【问题描述】:

我从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 创建者没有想到这个用例吗?

【问题讨论】:

    标签: java regex


    【解决方案1】:

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

    幸运的是 Matcher.reset() 返回 this 以便在流过滤器中轻松引用,虽然在使用前设置空白匹配器似乎有点浪费,但值得努力改变:

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

    ...有额外的行来初始化匹配器:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多