带有选项

时间:2016-04-04 15:58:11

标签: regex perl

我正在尝试解析此字符串和/ 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。

谢谢, 凯文

3 个答案:

答案 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后跟非/
  • 的内容
  • |或您的其他选择