【问题标题】:Why is Perl not printing all regex matches in a multi-line regex?为什么 Perl 不在多行正则表达式中打印所有正则表达式匹配?
【发布时间】:2017-11-15 08:47:32
【问题描述】:

我有这段文字(我的原文的缩短版):

mytext.txt BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU P>

我的代码如下,它打算打印所有匹配项,然后也将它们保存到一个文件中。但是除了我的原始文件中至少有 10 个之外,我没有得到任何匹配项。

open(text, "<mytext.txt");

push (@matches,$&) while(<text> =~ m{
    ([TR]{6}
    JFUA
    [ABR]{1}
    GAFG
    ( [LOP]{2,3} )
    [KW]{2,5}
    (??{ $2 =~ tr/LOP/ABC/r })
    AAAABB[UXZ]{1})
    /g
}x);

print "@matches\n";

my $filename = 'results_matches.txt';
open(my $fh, '>', $filename) or die "Could not open file '$filename' $!";
print $fh "@matches\n";
close $fh;
print "done\n";

我也尝试了以下代码,但也不起作用:

my @matches = <text> =~ m{
        ([TR]{6}
        JFUA
        [ABR]{1}
        GAFG
        ( [LOP]{2,3} )
        [KW]{2,5}
        (??{ $2 =~ tr/LOP/ABC/r })
        AAAABB[UXZ]{1})
        /g
    }x;

print "@matches\n";

我有以下代码,它只成功打印出一个(第一个)结果。但它无法打印所有匹配项。

if (<text> =~ m{
    ([TR]{6}
    JFUA
    [ABR]{1}
    GAFG
    ( [LOP]{2,3} )
    [KW]{2,5}
    (??{ $2 =~ tr/LOP/ABC/r })
    AAAABB[UXZ]{1})
}x) {print "$1\n";}

我已关注此主题中的答案,但无法让其中任何一个起作用:How can I find all matches to a regular expression in Perl?

【问题讨论】:

    标签: regex perl printing push tr


    【解决方案1】:

    通过使用while &lt;text&gt;,您可以在每次循环迭代时从文件句柄中读取一个新文件。您需要循环,一个循环遍历行,而内部循环遍历匹配项。

    while (my $line = <text>) {
        push @matches, $1 while $line
            =~ m{
                ([TR]{6}
                JFUA
                [ABR]
                GAFG
                ( [LOP]{2,3} )
                [KW]{2,5}
                (??{ $2 =~ tr/LOP/ABC/r })
                AAAABB[UXZ])
            }xg;
    }
    

    我还删除了{1},因为它没用,使用 $1 而不是 $& 因为 $& 对您在程序中所做的所有匹配施加了性能;并删除了/g 并将g 添加到正确的位置(即}x 旁边)。

    测试时,我从这里复制'n'粘贴了输入,即我将所有字符放在一行中。如果您的输入不同,请使用代码格式,而不是引号。

    【讨论】:

      猜你喜欢
      • 2015-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      相关资源
      最近更新 更多