匹配长度恒定的字符串?

时间:2017-01-14 14:36:54

标签: regex perl

为什么下面不输出两行?

$ cat tmp 
c9::dsk/c9t5000CCA23B2C6A65d0
c10::dsk/c10t5000C50086135011
$ cat tmp | perl -ne 'print "$1\n" if /(c\d\d?t[A-Z0-9]{15,16}d0)/'
c9t5000CCA23B2C6A65d0

第二个\d是可选的,所以它允许c10,长度在15到16个字符之间,所以应该没问题?

3 个答案:

答案 0 :(得分:2)

  

为什么下面不输出两行?

因为第二行不以d0结尾,所以从模式中删除它。

  

长度在15到16个字符之间,所以应该没问题?

c\d\d?t之后的子串的长度分别为18和16:

5000CCA23B2C6A65d0
5000C50086135011

所以改成它:

cat tmp | perl -ne 'print "$1\n" if /(c\d\d?t[A-Z0-9]{16,18})/'

答案 1 :(得分:2)

我认为你的数据看起来像是

  • c

  • 一位或两位小数

  • t

  • 十六位十六进制数字

  • 可选地,d0

要捕获的模式看起来像/(c\d{1,2}t\p{hex}{16}(?:d0)?)/

答案 2 :(得分:1)

试试这个:

cat tmp | perl -ne 'print "$1\n" if /(c\d+t[A-Z0-9]{16,18}(d0)?)/'
c9t5000CCA23B2C6A65d0
c10t5000C50086135011