Java 模式匹配器错误匹配的子字符串

标签 java regex pattern-matching matcher

我有一个位于特定文件路径的文件夹列表 当通过下面的 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/

相关文章:

java - 在Java中使用流分组并计算对象数组的平均值

python - 如何在给定开始时间和结束时间的情况下执行时间戳正则表达式?

javascript - 如何访问 ui-router 的 UrlMatcher?

unit-testing - 如何在 f# 中为模式匹配创建 fsunit 测试?

java - 为什么这个多行 Java 模式不匹配?

java - 错误: type List does not take parameters

Java:监听器子类不会更改父类(super class)按钮

regex - 将任何非数字转换为空白

java简单的正则表达式

java - 将 ASCII 编码的字节数组转换为字符串会产生奇怪的结果