我有一些情况,我需要使用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})(.*)\..*
这里的问题是,后三个也是匹配的。为了给你一个简短的概述,第一个“错误”匹配的字符串有什么问题:
第一个捕获组必须由6-7数字组成。(最后还需要捕获组)。如果在这些数字后面有字母,则必须有空格或下划线。“不应该被抓”的第一个例子显示了这一点。该条目无效,因为在 123456后面有字母123456,没有所需的符号。
最后一条并不重要,只是为了方便起见。
我遗漏了什么?我如何调整我的正则表达式,使我可以检查标志,只有当有字母在一个数字链后面?
发布于 2018-09-21 11:34:29
你可以用
^(\d{6,7})([_ ][A-Za-z].*)?\..*$详细信息
^ -字符串的开始(\d{6,7}) -第1组:6位或7位([_ ][A-Za-z].*)? -一个可选的捕获组#2:一个_或空格后面跟着一个字母,然后是尽可能多的0+字符,直到最后\. - ..* -行的其余部分$ -字符串的末端。发布于 2018-09-21 13:47:56
检查这个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
>https://stackoverflow.com/questions/52442697
复制相似问题