我有一个位于特定文件路径的文件夹列表 当通过下面的 cod 搜索时,它会给出以下文件列表
File[] fileList = folderListLocation.listFiles(someFileFilter);
//it gives following list
fileList=[NUTS, BOLTS, CAR_COMPONENTS_ADT,CAR_COMPONENTS_ADT1, WINDSHIELD]
现在我正在尝试获取一个特定名称的文件夹的计数,这意味着如果我使用模式匹配器查找 CAR_COMPONENTS_ADT,它应该计数为 2,如果我使用模式匹配器查找 NUTS,我应该算作 1
现在我使用以下代码将此文件列表与以下代码中的某些模式进行匹配
int count=0;
Pattern pattern = Pattern.compile(patternName);
for(File f: fileList){
Matcher matcher = pattern.matcher(f.getName());
if(matcher.find()){
count++;
}
}
现在在正常情况下这工作正常,假设 patternName = "BIRD",它不会与文件列表和最终值匹配
count will be 0
但是如果 patternName = "CAR_COMPONENTS",它会导致
count as 2
所以我不明白的是模式匹配器如何匹配“CAR_COMPONENTS”与“CAR_COMPONENTS_ADT”和“CAR_COMPONENTS_ADT1”。尽管它是一个子字符串,但我正在寻找完全匹配而不是部分匹配。
非常欢迎提出建议和改进。提前致谢
最佳答案
您只想匹配未包含字母/下划线的术语。
使用
int count=0;
Pattern pattern = Pattern.compile("(?<![_\\p{L}])" + patternName + "(?![_\\p{L}])");
for(File f: fileList) {
Matcher matcher = pattern.matcher(f.getName());
if(matcher.find()){
count++;
}
}
参见 regex demo with CAR_COMPONENTS_ADT
和 a regex demo with CAR_COMPONENTS
.
(?<![_\p{L}])
是一个负向后视,匹配字符串中不紧跟 _
的位置或任何字母(将 \p{L}
替换为 [A-Za-z]
或 \p{Alpha}
以仅匹配 ASCII 字母)和 (?![_\p{L}])
如果有一个字母或 _
是一个否定的前瞻性匹配失败紧靠当前位置的右侧。
关于Java 模式匹配器错误匹配的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50857224/