2017-10-17 106 views
3

传入patternformat,因为他们都较低套管,我怎么可以改变的代码下面的代码片段,以便startsWithendsWith回报true如果模式和格式匹配不区分大小写?不区分大小写路径startsWIth的endsWith

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()); 
    } 

是否有这样做比下面的漂亮方式:

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

'toUpperCase()'或'toLowerCase()'路径的字符串和'格式'。 –

+1

[查看本问答](https://stackoverflow.com/q/19154117/335858)剧透:这不太好。 – dasblinkenlight

回答

1

解决方法1:不要测试大写和小写字母,只需更改输入/测试值是小写&刚检查小写: -

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)) 
} 
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处理不规则大小写映射更有效率。

0

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

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

p.toString.toLowerCase() ...... endsWith()startsWith(),可以使用的方法为一个字符串参数作为这两种方法的endsWith和startsWith重载用2种变体
1)为路径类参数
2)作为字符串参数。