java.util.regex.Pattern与在线regex调试器不同

时间:2018-12-22 23:41:21

标签: java regex

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

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

+--+------+---+-------------------+
|id|cardId|elo|timestamp          |
+--+------+---+-------------------+
|4 |000ac9|130|2018-12-19 17:59:16|
|5 |000ad9|260|2018-12-19 19:01:16|
+--+------+---+-------------------+

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

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

  • 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
  • .gruell.exe.398sn

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

有问题的代码:

gruell.*\.exe[^\.]

功能:

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

2 个答案:

答案 0 :(得分:2)

  

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

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

这使我想到了您的模式问题。如您所见,

  

现在最有趣的部分是当我删除[^。]时,它将检测到

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

如果您希望比赛以.exe结尾,那么请锚定您的模式:gruell.*\.exe$

答案 1 :(得分:0)

好的,感谢约翰·波林格(John Bollinger)提供的网站https://www.regexplanet.com/advanced/java/index.html,在这里我发现了两处错误的地方。

首先我必须使用:

 pattern.matcher(file.name).matches()

而不是我拥有的东西:

 pattern.matcher(file.name).find()

第二步,我不得不从字符串末尾删除[^。]。

发件人:

"gruell.*\\.exe[^.]"

收件人:

"gruell.*\\.exe"