我有一些情况,需要用regex
进行过滤。下面列出了需要过滤的值:
// These should be catched
123456_Test.pdf
123456 Test.pdf
123456.pdf
// These shouldn't be catched
123456Abcasd.pdf
123456-Abcasd.pdf
123456_.pdf
当前的regEx如下所示:
(\d{6,7})((\_| ){0,1})(.*)\..*
这里的问题是,后3个也匹配。为了简要介绍一下,第一个“错误”匹配的字符串出了什么问题?
第一个捕获组必须包含6-7
位数字。 (最后也需要捕获组)。 如果在这些数字后面有字母,则必须为空格或下划线。 “不应被捕获”的第一个示例显示了这一点。该条目无效,因为在123456后的字母中没有所需的符号。
最后一个输入并不是很重要,只是为了方便起见。
我想念什么?仅当数字链后面有字母时,如何调整正则表达式,以便可以检查符号?
答案 0 :(得分:1)
您可以使用
^(\d{6,7})([_ ][A-Za-z].*)?\..*$
请参见regex demo
详细信息
^
-字符串的开头(\d{6,7})
-第1组:6或7位数字([_ ][A-Za-z].*)?
-可选的捕获组#2:_
或空格,后跟一个字母,然后尽可能多的0+个字符,直到最后一个\.
-.
在线.*
-该行的其余部分$
-字符串的结尾。答案 1 :(得分:0)
检查此perl解决方案是否适合您。
> cat regex_catch.dat
123456_Test.pdf
123456 Test.pdf
123456.pdf
123456Abcasd.pdf
123456-Abcasd.pdf
123456_.pdf
> perl -ne ' print if m/\d+(([ _])[a-zA-Z]+| [a-zA-Z]*)?\.pdf/ ' regex_catch.dat
123456_Test.pdf
123456 Test.pdf
123456.pdf
>