java - java.util.regex.Pattern 不同意在线正则表达式调试器
问题描述
我正在为程序使用一些正则表达式,我希望程序检测到某个 exe,称为 gruell[something].exe
所以我最终得到了以下正则表达式:
gruell.*\.exe[^\.]
在这两个站点上进行测试后,我的测试用例被正确检测到
我的测试集:(以及应该失败和通过的)
- gruell-Core.exe [通过]
- Gruell.exe [通过]
- gruell_x64.exe [通过]
- Gruell_x64-core.exe [通过]
- grull.exe [失败]
- gruell_____.exe [通过]
- gruell_installer.msi [失败]
- gruell.html [失败]
- .gruell.exe.398sn [失败]
- gru-ell.exe [失败]
当我使用 java.util.regex.Pattern 在我的机器上运行它时,它不会找到任何东西,即使我告诉它扫描的文件夹包含以下两者:
- 粥
- .gruell.exe.398sn
现在有趣的部分是当我删除 [^.] 时它会检测到,但是,它也会检测到 .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);
}
}
}
解决方案
在对 [regex101 和 RegExr] 进行测试后,我的测试用例被正确检测到
这似乎不太可能,因为您的模式确实是错误的,不仅在 Java 的 Regex 方言中,而且在那些站点测试的方言中也是如此。我看到的唯一合理的解释是,您实际上并没有测试您认为的情况。例如,您的测试输入可能有尾随空格或换行符。
这让我想到了你的模式的问题。正如你已经观察到的,
现在有趣的部分是当我删除 [^.] 它会检测到,
那是因为该子表达式匹配一个字符(不同于.
)。因此,您的整体模式确实不匹配"gruell-Core.exe"
,因为 . 之后没有字符.exe
。尝试匹配"gruell-Core.exee"
。
如果您希望匹配以 结尾.exe
,则改为锚定您的模式:gruell.*\.exe$
推荐阅读
- mysql - 如何将姓名号码电子邮件ID添加到我的mysql数据库
- amazon-web-services - 来自自定义资源的云形成函数
- android - 如何使用 Firebase 17.0.1 执行 INSTANCE_ID_EVENT 操作?
- html - 无法平均显示 html 表格大小
- r - 如何计算R中一列中两个日期之间的天数
- javascript - Laravel 5 通过 laravel:5 查询检查表中是否存在两条记录
- r - 在R中查找数据框中的第二高值
- cordova - 在 MFP 控制台中为特定用户发送推送通知
- mysql - 如何更改查询以使其更快?
- javascript - 双击单个按钮时重定向