首页 > 解决方案 > java.util.regex.Pattern 不同意在线正则表达式调试器

问题描述

我正在为程序使用一些正则表达式,我希望程序检测到某个 exe,称为 gruell[something].exe

所以我最终得到了以下正则表达式:

gruell.*\.exe[^\.]

在这两个站点上进行测试后,我的测试用例被正确检测到

我的测试集:(以及应该失败和通过的)

当我使用 java.util.regex.Pattern 在我的机器上运行它时,它不会找到任何东西,即使我告诉它扫描的文件夹包含以下两者:

现在有趣的部分是当我删除 [^.] 时它会检测到,但是,它也会检测到 .gruell.exe.398sn,这是我不想要的。

有问题的代码:

File f = new File("G:\\dev\\gruell");
recursive_scan(f);

功能:

for (file : location.listFiles())
{
    if (file.isDirectory)
    {
         recursive_scan(file)
    }
    else
    {
         Pattern pattern = Pattern.compile("gruell.*\\.exe[^\\.]", Pattern.CASE_INSENSITIVE);
         if (pattern.matcher(file.name).find())
         {
              System.out.println("FOUND: " + file.name);   
         }
     }
 }

标签: javaregex

解决方案


在对 [regex101 和 RegExr] 进行测试后,我的测试用例被正确检测到

这似乎不太可能,因为您的模式确实是错误的,不仅在 Java 的 Regex 方言中,而且在那些站点测试的方言中也是如此。我看到的唯一合理的解释是,您实际上并没有测试您认为的情况。例如,您的测试输入可能有尾随空格或换行符。

这让我想到了你的模式的问题。正如你已经观察到的,

现在有趣的部分是当我删除 [^.] 它会检测到,

那是因为该子表达式匹配一个字符(不同于.)。因此,您的整体模式确实不匹配"gruell-Core.exe",因为 . 之后没有字符.exe。尝试匹配"gruell-Core.exee"

如果您希望匹配以 结尾.exe,则改为锚定您的模式:gruell.*\.exe$


推荐阅读