RegExp仅在之后有文本时才检查符号

时间:2018-09-21 11:24:06

标签: 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

当前的regEx如下所示:

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

这里的问题是,后3个也匹配。为了简要介绍一下,第一个“错误”匹配的字符串出了什么问题?

第一个捕获组必须包含6-7位数字。 (最后也需要捕获组)。 如果在这些数字后面有字母,则必须为空格或下划线。 “不应被捕获”的第一个示例显示了这一点。该条目无效,因为在123456后的字母中没有所需的符号。

最后一个输入并不是很重要,只是为了方便起见。

我想念什么?仅当数字链后面有字母时,如何调整正则表达式,以便可以检查符号?

2 个答案:

答案 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
>