在正则表达式中匹配可变长度的数字或字母数字

时间:2014-03-06 05:58:10

标签: regex perl

我正在使用Perl从文本文件中提取某些行。所有行都以11个字符代码开头,如

 XXX   YXXXZZXX  Data to get

其中X始终为数字,Y可以是字母数字或缺失,Z可以是字母数字(具体可以是A或数字{{1}另一个问题是,如果0-9部分是三个字符而不是2,那么这个字符代码有时可以是12个字符长。

Z

我可以在前三个 XXX YXXXZZZXX Data to get X中进行硬编码,但我需要代码对Y具有灵活性。我基本上需要将Z存储为ID变量。对于上下文,前三个字母表示调查中的问题编号“要获取的数据”是答案。所以假设我正在寻找问题Z然后(假设Q72没有丢失72)我正在使用的匹配代码是

Y

这似乎解决了11对12字符的问题,因为11个字符代码中的最后一个 if(m{^072(\s+)YXXX(d\{2,3})(\d{2})(\s+)(.+)}){ my $id = $2; my $Data = $5 } 总是只有两个字符长。如果代码长度为12个字符,则增加的唯一部分是XX部分。所以这应该能够捕获所有2位和3位数的id(如果我错了,请纠正我)。

问题在于,有时id会是Z(从不AA),我需要使代码足够灵活,以便对所有2位和3位代码执行if语句以及潜在的AAA id。

我试过

AA

但我不认为它的工作正常。我认为 if(m{^072(\s+)YXXX(.{2,3})(\d{2})(\s+)(.+)}){ my $id = $2; my $Data = $5 } 可能过于灵活。有关正确方法的任何建议吗?谢谢!

2 个答案:

答案 0 :(得分:1)

也许以下内容会有所帮助:

use strict;
use warnings;

while (<DATA>) {
    my ( $id, $data ) = /^072\s+\w{4}(\w{2,3})\w{2}\s+(.+)/;
    print "ID: $id; Data: $data\n";
}

__DATA__
072 C001AA00 Data1 to get
072 C0010300 Data2 to get
072 C00110200 Data3 to get

输出:

ID: AA; Data: Data1 to get
ID: 03; Data: Data2 to get
ID: 102; Data: Data3 to get

答案 1 :(得分:1)

  

一般模式:XXX YXXXZZXX获取数据

     

其中X总是一个数字,Y可以是字母数字或缺少,Z可以是   字母数字(特别是它可以是A或数字0-9。另一个   皱纹是有时这个字符代码可以是12个字符   如果Z部分是三个字符而不是2个,则为long。

试图翻译您的规格,我想出了这个:

[\d]{3}\s*[\d\w]?[\d]{3}[A\d]{2,3}[\d]{2}\s*(.+)

演示:

http://regexr.com?38ejs


更新:

还有另一个演示(包含所有测试用例+匹配组):

http://rubular.com/r/6asYzHqi5P

  

072 C001AA00数据得到1

     

072 C0010300数据得到2

     

072 C00110200数据得到3

相关问题