Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不区分大小写的路径startsWIth endsWith_Java_File_Path_Java 8 - Fatal编程技术网

Java 不区分大小写的路径startsWIth endsWith

Java 不区分大小写的路径startsWIth endsWith,java,file,path,java-8,Java,File,Path,Java 8,传入的模式和格式都是小写的,如果模式和格式不区分大小写,我如何更改下面的代码片段,使开始时使用和结束时使用返回真 try (Stream<Path> paths = Files.find(cobDir, 1, (path, attrs) -> attrs.isRegularFile() && path.getFileName().startsWith(pattern)

传入的
模式
格式
都是小写的,如果模式和格式不区分大小写,我如何更改下面的代码片段,使
开始时使用
结束时使用
返回

  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(流路径=Files.find(cobDir,1,
(路径,attrs)->attrs.isRegularFile()
&&path.getFileName().startsWith(模式)
&&path.toString().endsWith(格式))){
matchingFile=path.findFirst();
}捕获(IOE异常){
错误(“获取文件以处理{}的问题”,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());
    }
try(流路径=Files.find(cobDir,1,
(路径,attrs)->attrs.isRegularFile()
&&path.getFileName().toString().toLowerCase().StartWith(模式)
&&path.toString().toLowerCase().endsWith(格式))){
matchingFile=path.findFirst();
}捕获(IOE异常){
错误(“获取文件以处理{}的问题”,e.getMessage());
}

解决方案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());
    }
try(流路径=Files.find(cobDir,1,
(路径,attrs)->attrs.isRegularFile()
&&path.getFileName().toLowerCase().StartWith(模式)
&&path.toString().toLowerCase().endsWith(格式))){
matchingFile=path.findFirst();
}捕获(IOE异常){
错误(“获取文件以处理{}的问题”,e.getMessage());
}
解决方案2:将正则表达式(未包含)更改为:-

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

try (Stream<Path> paths = getPaths()){
...
}
try(流路径=getpath()){
...
}
将所有丑陋的东西粘在一个函数中:-

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))
}
private Stream getpath(/**cobDir,pattern,format*/){
返回文件。查找(cobDir,1,
(路径,attrs)->attrs.isRegularFile()
&&
path.getFileName().toString().toLowerCase().StartWith(模式)
&&path.toString().toLowerCase().endsWith(格式))
}

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

  • string.startsWith(pattern)
    可以替换为
    string.regionMatches(true,0,pattern,0,pattern.length())
  • string.endsWith(格式)
    可以替换为
    string.regionMatches(true,string.length()-format.length(),format,0,format.length())
第一个参数参数(
true
)表示需要不区分大小写的匹配

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

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

另一方面,当您只想在开始或结束时匹配一个区域时,转换整个字符串所做的工作远远超出了必要的范围。特别是对于字符串大小首先排除匹配的情况<代码>区域匹配首先检查此项。如果字符已经匹配,它也不会执行大小写转换


因此,
regionMatches
处理不规则的大小写映射,效率更高。

使用String类
toLowerCase()
方法。 e、 g

p.toString.toLowerCase()
endsWith()
startsWith()
,您可以使用字符串参数的方法,因为方法endsWith和startsWith都使用了两个变量重载
1) 作为路径类参数
2) 作为字符串参数。

toUpperCase()
toLowerCase()
路径的字符串和
格式
。剧透:不好看。
Path p = new File("res.txt").toPath();