【发布时间】:2014-03-07 07:31:38
【问题描述】:
我正在使用 Perl 从文本文件中提取某些行。这些行都以十一个字符代码开头,例如
XXX YXXXZZXX Data to get
其中X 总是一个数字,Y 可以是字母数字或缺失,Z 可以是字母数字(特别是它可以是 A 或数字 0-9。另一个问题是,有时这个字符如果Z 部分是三个字符而不是 2 个字符,则代码可以是 12 个字符。
XXX YXXXZZZXX Data to get
我可以在前三个 X 和 Y 中硬编码,但我需要代码对 Z 灵活。我基本上需要将Z 存储为ID 变量。就上下文而言,前三个字母表示“要获取的数据”是答案的调查中的问题编号。所以假设我正在寻找问题72 然后(假设Y 不缺少Q72)我正在使用的匹配代码是
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),我需要使代码足够灵活,以便对所有 2 位和 3 位代码以及潜在的 @ 执行 if 语句987654340@身份证。
我试过了
if(m{^072(\s+)YXXX(.{2,3})(\d{2})(\s+)(.+)}){
my $id = $2;
my $Data = $5
}
但我不认为它工作得很好。我认为. 可能太灵活了。关于正确方法的任何建议?谢谢!
【问题讨论】:
-
你能举例说明你想匹配和提取什么吗?
-
072 C001AA00 Data to get或072 C0010300 Data to get或072 C00110200 Data to get。第一个 ID 是AA,第二个 ID 是03,第三个 ID 是102。谢谢。 -
最后两个
XX总是 2 位数吗?如果是这样,您可以离开.{2,3}并使用\d{2}代替最后一个 XX。这将解决“过于灵活”的部分。另请注意,如果您也不需要它们,则不需要在\s+或\d+周围使用括号。你应该可以使用^072\s+YXXX(.{2,3})\d+\s+(.+),然后得到my $id = $1; my $Data = $2。 -
嗨@Jerry。是的,
XX总是 2 位数长。我在输入上面的代码时出错了。我已经更改了帖子以反映这一点。谢谢!