RegExp仅当后面有文本时才检查符号

RegExp仅当后面有文本时才检查符号,regex,Regex,我有一些案例,需要使用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 当前的正则表达式如下所示: (\d{6,7})((\\\\|){0,1})(.*)\..* 这里的问题是,后3个也是匹配的。为了给您一

我有一些案例,需要使用
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
当前的正则表达式如下所示:

(\d{6,7})((\\\\|){0,1})(.*)\..*

这里的问题是,后3个也是匹配的。为了给您一个简短的概述,第一个“错误”匹配字符串有什么问题:

第一个捕获组必须由
6-7位
数字组成。(最后还需要捕获组)如果这些数字后面有字母,则必须有空格或下划线。“不应该被抓住”的第一个例子说明了这一点。该条目无效,因为在123456之后有字母,但没有所需的符号

最后一条并不重要,只是为了方便

我错过了什么?如何调整正则表达式,使其仅在数字链后面有字母时才能检查符号?

您可以使用

^(\d{6,7})([_ ][A-Za-z].*)?\..*$

详细信息

  • ^
    -字符串的开头
  • (\d{6,7})
    -第1组:6或7位数字
  • ([[u][A-Za-z].*)
    -一个可选的捕获组#2:A
    或后跟字母的空格,然后是尽可能多的任何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
>

试试看,你的工作很有魅力!非常感谢你。你想把它添加为答案吗?