正则表达式的测试用例失败了

时间:2018-02-21 10:42:07

标签: java regex

我有以下正则表达式:

^[EC]D_V_[a-zA-Z]{5}____([0-9]{8})_[0-9]{3}_[a-zA-Z](_[0-9]{1,7})?\.([^<>:\\”\/\\|\\*\\?]{3,4})(\.gz)?

和这个测试数据:

CD_V_DoSto____00000000_255_A_952086.445 
ED_V_DoSto____99999999_255_A_91459._416.gz 

为什么第二个文件失败,但是如果我将第一个文件编辑为CD_V_DoSto____00000000_255_A_952086.445.gz则它正在运行。

我认为0-9{8}导致问题,但我无法验证它......

您可以在这里测试一下:regex101

1 个答案:

答案 0 :(得分:3)

这里要考虑三件事:

  • ^锚点默认情况下仅匹配字符串的开头,以使其与行开头匹配,您需要使用(?m)添加模式或使用m多行选项
  • 第3组模式需要任何3或4个字符,但需要集合中的字符,但由于{3,4}量词是贪婪的,.之前的gz匹配且.gz不属于第4组。您应该将.添加到否定字符集
  • 如果整个字符串匹配,请不要忘记在正则表达式测试器中使用$。在Java matches方法中,您不需要使用^$来匹配整个字符串,默认情况下会匹配匹配。

请参阅fixed regex fiddle

^[EC]D_V_[a-zA-Z]{5}____([0-9]{8})_[0-9]{3}_[a-zA-Z](_[0-9]{1,7})?\.([^.<>:”\/|*?]{3,4})(\.gz)?$

在Java中,您可以使用

Boolean isValid = s.matches("[EC]D_V_[a-zA-Z]{5}____([0-9]{8})_[0-9]{3}_[a-zA-Z](_[0-9]{1,7})?\\.([^.<>:”/|*?]{3,4})(\\.gz)?");