Java String matches方法斜杠匹配失效问题求助
问题分析与解决方案
核心问题
你代码里的关键错误在于对file.getFileName().toString()的理解:这个方法只返回文件的名称(比如目标文件返回的是overlay.properties),完全不包含任何路径分隔符/。所以你之前写的带\/的正则,自然找不到匹配项;而不带路径分隔符的正则又会匹配到文件名前缀带其他字符的文件(比如shouldnotmatchoverlay.properties)。
正确解决方案
根据你的需求,分三种场景给出方案:
场景1:仅匹配文件名恰好是overlay.properties的文件
直接用字符串相等判断,简单高效,完全避免正则的误匹配:
Files.walk(Paths.get(SOURCE_CONFIG_PATH)) .filter(Files::isRegularFile) .filter(file -> "overlay.properties".equals(file.getFileName().toString())) .forEach(System.out::println);
场景2:必须用正则匹配文件名(比如后续有复杂规则)
用^和$限定正则的开头和结尾,确保整个文件名就是目标字符串:
Files.walk(Paths.get(SOURCE_CONFIG_PATH)) .filter(Files::isRegularFile) .filter(file -> file.getFileName().toString().matches("^overlay\\.properties$")) .forEach(System.out::println);
场景3:需要同时验证文件所在的路径结构
如果要求文件必须在类似server1这类目录下,就需要用完整文件路径来匹配,此时调用file.toString()获取全路径:
Files.walk(Paths.get(SOURCE_CONFIG_PATH)) .filter(Files::isRegularFile) .filter(file -> file.toString().matches(".*/server\\d+/overlay\\.properties$")) .forEach(System.out::println);
这个正则会匹配所有在server+数字目录下的overlay.properties文件,避免其他目录下的同名文件干扰。
内容的提问来源于stack exchange,提问作者James Jithin
相关产品推荐
相关产品推荐

