Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有选项的Perl Regexp_Regex_Perl - Fatal编程技术网

带有选项的Perl Regexp

带有选项的Perl Regexp,regex,perl,Regex,Perl,我试图解析这个字符串以及/TN和end forward/之间的数字。此外,如果有一个/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

我试图解析这个字符串以及/TN和end forward/之间的数字。此外,如果有一个/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

谢谢,
Kevin

您可以使用以下正则表达式:

\/TN\s+([^\/]+)(?:(?!\/TN|\/REF).)*(?:\/REF\s+([^\/]+))?

说明:

  • \/TN\s+([^\/]+)
    :在
    /TN
    之后匹配除
    /
    以外的字符,并放入捕获组1
  • (?:(?!\/TN |\/REF)。*
    :匹配字符的逻辑,确保字符中没有
    /TN
    /REF
  • (?:\/REF\s+([^\/]+)?
    :可以选择在
    /REF
    之后匹配除
    /
    以外的字符,并将其放入捕获组2中
试试这个:
\/(TN[^\/]+)\/(REF[^\/]+)

解释
  • \/
    转义
    /
  • (TN[^\/]+)
    捕获
    TN
    ,然后是非
    /
  • |
    或您的其他选项

您可以使用
/TN
作为记录分隔符,并使用文件处理程序读取字符串:

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;
}
my@res;
{
我的$ref;
本地$/='/TN';

打开我的$fh,'欢迎来到Stack Overflow。我不明白你在问什么。你的问题中没有问题。请用它来澄清你想知道什么,或者什么不起作用。