我正在使用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
}
可能过于灵活。有关正确方法的任何建议吗?谢谢!
答案 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://rubular.com/r/6asYzHqi5P
072 C001AA00数据得到1
072 C0010300数据得到2
072 C00110200数据得到3