我有以下正则表达式:
^[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
答案 0 :(得分:3)
这里要考虑三件事:
^
锚点默认情况下仅匹配字符串的开头,以使其与行开头匹配,您需要使用(?m)
添加模式或使用m
多行选项{3,4}
量词是贪婪的,.
之前的gz
匹配且.gz
不属于第4组。您应该将.
添加到否定字符集$
。在Java matches
方法中,您不需要使用^
或$
来匹配整个字符串,默认情况下会匹配匹配。^[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)?");