不区分大小写的路径startWIth endsWith

时间:2017-10-17 11:20:06

标签: java file path java-8

传入的patternformat,因为它们都是较低的,我如何更改以下代码段,以便startsWithendsWith返回{{ 1}}如果模式和格式匹配不区分大小写?

true

有没有比下面这样更漂亮的方式:

  try (Stream<Path> paths = Files.find(cobDir, 1,
            (path, attrs) -> attrs.isRegularFile()
                    && path.getFileName().startsWith(pattern)
                    && path.toString().endsWith(format))) {
        matchingFile = paths.findFirst();
    } catch (IOException e) {
        logger.error("Problem with getting files to process {}", e.getMessage());
    }

4 个答案:

答案 0 :(得分:3)

startsWithendsWith只是匹配字符串区域的特殊情况,也可以通过常规regionMatches方法处理:

  • string.startsWith(pattern)可以替换为 string.regionMatches(true, 0, pattern, 0, pattern.length())
  • string.endsWith(format)可以替换为 string.regionMatches(true, string.length()-format.length(), format, 0, format.length())

第一个参数参数(true)表示需要不区分大小写的匹配。

在第二种情况下,首先必须将字符串存储到局部变量中,以便能够在其上调用两个方法,这可能不太方便,但是,这仍然优于将字符串转换为大写或小写并调用startsWithendsWith

首先,转换为 ,大写或小写,不足以处理不区分大小写匹配的所有字符。正如the documentation of regionMatches提到的那样,由于某些Unicode字符的不规则大小写映射,必须检查两者。当然,当您确定只处理ASCII或拉丁字符串时,这可能是不必要的。

另一方面,当您只想匹配开头或结尾的区域时转换整个字符串,所做的远远超过必要。特别是对于字符串大小首先排除匹配的情况。 regionMatches先检查一下。如果字符已经匹配,它也不会执行大小写转换。

因此regionMatches处理不规则的案例映射并且更有效。

答案 1 :(得分:1)

解决方案1:不要测试大写和小写,只需将输入/测试值更改为小写&amp;只检查小写: -

try (Stream<Path> paths = Files.find(cobDir, 1,
            (path, attrs) -> attrs.isRegularFile()
                    && path.getFileName().toLowerCase().startsWith(pattern)
                    && path.toString().toLowerCase().endsWith(format))) {
        matchingFile = paths.findFirst();
    } catch (IOException e) {
        logger.error("Problem with getting files to process {}", e.getMessage());
    }

解决方案2:将正则表达式(未包含)转换为not take case into account: -

有没有更好的格式化方式,是的: -

try (Stream<Path> paths = getPaths()){
...
}

并将所有丑陋的东西粘在一个函数中: -

private Stream<Path> getPaths(/** cobDir, pattern, format */){
  return Files.find(cobDir, 1,
              (path, attrs) -> attrs.isRegularFile()
                      &&
    path.getFileName().toString().toLowerCase().startsWith(pattern)
                      && path.toString().toLowerCase().endsWith(format))
}

答案 2 :(得分:0)

使用String类toLowerCase()方法。 例如,

Path p = new File("res.txt").toPath();

p.toString.toLowerCase() ...... endsWith()startsWith(),您可以将这些方法用于字符串参数,因为两种方法 endsWith和startsWith都会重载2个变体< /强>
1)作为Path类参数
2)作为String参数。

答案 3 :(得分:0)

为此我会使用不区分大小写的正则表达式

final Pattern FILTER = Pattern.compile(
    Pattern.quote(pattern) + ".*" + Pattern.quote(format),
    Pattern.CASE_INSENSITIVE
);
Optional<Path> matchingFile = Files.find(cobDir, 1, (path, attrs) ->
        attrs.isRegularFile() && FILTER.matcher(path.toString()).matches()
    )
    .findFirst();