我正在使用 Perl 从文本文件中提取某些行。这些行都以十一个字符代码开头,例如
XXX YXXXZZXX Data to get
其中 X
始终是数字,Y
可以是字母数字或缺失,Z
可以是字母数字(具体可以是 A
或数字 0-9
。另一个问题是,如果 Z
部分是 3 个字符而不是 2 个字符,则有时此字符代码可以是 12 个字符长.
XXX YXXXZZZXX Data to get
我可以在前三个 X
和 Y
中进行硬编码,但我需要代码对于 Z
具有灵活性。我本质上需要将 Z
存储为 ID 变量。对于上下文,前三个字母表示调查中“要获取的数据”作为答案的问题编号。因此,假设我正在寻找问题 72
(假设 Q72 没有缺少 Y
),我使用的匹配代码是
if(m{^072(\s+)YXXX(d\{2,3})(\d{2})(\s+)(.+)}){
my $id = $2;
my $Data = $5
}
这似乎解决了 11 与 12 字符的问题,因为 11 字符代码中的最后一个 XX
始终只有两个字符长。如果代码长度为 12 个字符,则唯一增加的部分是 Z
部分。所以这应该能够捕获所有 2 位和 3 位数字的 ID(如果我错了,请纠正我)。
问题是,有时 id 会是 AA
(绝不是 AAA
),我需要使代码足够灵活,以便为所有内容执行 if 语句2 位和 3 位数字代码以及潜在的 AA
id。
我已经尝试过
if(m{^072(\s+)YXXX(.{2,3})(\d{2})(\s+)(.+)}){
my $id = $2;
my $Data = $5
}
但我认为它工作得不太正常。我认为 .
可能太灵活了。关于执行此操作的正确方法有什么建议吗?谢谢!
最佳答案
General Pattern : XXX YXXXZZXX Data to get
where X is always a digit, Y can be alphanumeric or missing, Z can be alphanumeric (specifically it can be A or a digit 0-9. The other wrinkle is that sometimes this character code can be 12 characters long if the Z part is three characters instead of 2.
尝试翻译您的规范,我想出了这个:
[\d]{3}\s*[\d\w]?[\d]{3}[A\d]{2,3}[\d]{2}\s*(.+)
演示:
更新:
还有另一个演示(包含所有测试用例+匹配组):
http://rubular.com/r/6asYzHqi5P
072 C001AA00 Data to get 1
072 C0010300 Data to get 2
072 C00110200 Data to get 3
关于regex - 匹配正则表达式中可变长度的数字或字母数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22216237/