我正在尝试解析此字符串和/ TN之间的数字并结束前进/。此外,如果有/ REF我也需要抓住REF#。所以它可能是一种或两种情况。
示例字符串:
my $acis_string = 'EL41X/TN 333-3333 /DES TAT 313 223-2388 OE508-1-12-13/ORD R1244850301 /CD 02-03-15 /ZKMA 8001 T1ZF PNTCMINEDC0 PNTCMISOH00/SCS DQKUX /TN 333-3330, 6540/RTI 581 /LSO 248 340/REF 28/TGP 581 /ORD C1244888657/CD 02-12-16';
他是我的基础regexp:
push @matches, [$2, $1] while $acis_string =~ /\/TN (.*?)\/.*?(\/REF (\w+)\/)?/g;
期望的输出:
$VAR1 = [
[
n/a,
'333-3333 '
],
[
28,
'333-3330, 6540'
]
];
注意: 字符串中可能有很多/ TN /和/ REF。
谢谢, 凯文
答案 0 :(得分:1)
You can use /TN
as a record separator and read the string with a filehandler:
my @res;
{
my $ref;
local $/='/TN ';
open my $fh, '<', \$acis_string;
<$fh>;
while(<$fh>) {
$ref = m#/REF ([^/]*[^/\s])# ? $1 : 'n/a';
push @res, [$ref, m#^([^/]*[^/\s])#];
}
close $fh;
}
答案 1 :(得分:0)
您可以使用以下正则表达式:
\/TN\s+([^\/]+)(?:(?!\/TN|\/REF).)*(?:\/REF\s+([^\/]+))?
请参阅this
<强>解释强>
\/TN\s+([^\/]+)
:在/
之后匹配/TN
以外的字符并放入捕获组1 (?:(?!\/TN|\/REF).)*
:匹配字符的逻辑,确保其中没有/TN
或/REF
(?:\/REF\s+([^\/]+))?
:可选择在/
之后匹配/REF
以外的字符并放入捕获组2 答案 2 :(得分:0)
试试这个:\/(TN[^\/]+)|\/(REF[^\/]+)
\/
已转发/
(TN[^\/]+)
抓取TN
后跟非/
|
或您的其他选择