传入的pattern
和format
,因为它们都是较低的,我如何更改以下代码段,以便startsWith
和endsWith
返回{{ 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());
}
答案 0 :(得分:3)
startsWith
和endsWith
只是匹配字符串区域的特殊情况,也可以通过常规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
)表示需要不区分大小写的匹配。
在第二种情况下,首先必须将字符串存储到局部变量中,以便能够在其上调用两个方法,这可能不太方便,但是,这仍然优于将字符串转换为大写或小写并调用startsWith
或endsWith
:
首先,转换为 ,大写或小写,不足以处理不区分大小写匹配的所有字符。正如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();