为什么 Perl 不打印多行正则表达式中的所有正则表达式匹配项?
Why is Perl not printing all regex matches in a multi-line regex?
我有这段文字(我的原文的缩略版):
mytext.txt
BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU
我的代码如下,它打算打印所有匹配项,然后将它们也保存到一个文件中。但是我没有得到任何匹配,除了我的原始文件中至少有 10 个。
open(text, "<mytext.txt");
push (@matches,$&) while(<text> =~ m{
([TR]{6}
JFUA
[ABR]{1}
GAFG
( [LOP]{2,3} )
[KW]{2,5}
(??{ =~ 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}
(??{ =~ 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}
(??{ =~ tr/LOP/ABC/r })
AAAABB[UXZ]{1})
}x) {print "\n";}
我已按照本主题中的答案进行操作,但无法使其中任何一个起作用:How can I find all matches to a regular expression in Perl?
通过使用 while <text>
,您可以在循环的每次迭代中从文件句柄读取一个新文件。您需要循环,一个遍历行,一个内循环遍历匹配项。
while (my $line = <text>) {
push @matches, while $line
=~ m{
([TR]{6}
JFUA
[ABR]
GAFG
( [LOP]{2,3} )
[KW]{2,5}
(??{ =~ tr/LOP/ABC/r })
AAAABB[UXZ])
}xg;
}
我还删除了 {1}
,因为它没用,使用 $1 而不是 $&,因为 $& 对您在程序中所做的所有匹配施加了不利的性能;并删除 /g
并将 g
添加到正确的位置(即 }x
旁边)。
测试时,我从这里复制'n'粘贴输入,即所有字符都在一行中。如果您的输入不同,请使用它的代码格式,而不是引用。
我有这段文字(我的原文的缩略版):
mytext.txt BAHJSBUBGUCYHAGSBUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYTRTRTRJFUARGAFGOOPWWKBBCAAAABBXHABSDAUSBCZAAAAAAAAACGAFAXHJBJHXZCXZCCZCXZUCAGSUCBASBCYHUBXZCZPZHCUIHAUISHCIUJXZJCBZYAUSGHDYUAGWEBWHBHJASBHJASCXZBUYHABSDAUSZXHJBRRRRRRJFUABGAFGLLPKWAACAAAABBZJHXZXHJBJHXZXHJBJHXJBJHXZCXZCCZCXZUCAGSAJIJICXZIJUAUUISUSJUSSJSJSJAJCXZXCZTTTTTRJFUABGAFGLOPKWABCAAAABBU
我的代码如下,它打算打印所有匹配项,然后将它们也保存到一个文件中。但是我没有得到任何匹配,除了我的原始文件中至少有 10 个。
open(text, "<mytext.txt");
push (@matches,$&) while(<text> =~ m{
([TR]{6}
JFUA
[ABR]{1}
GAFG
( [LOP]{2,3} )
[KW]{2,5}
(??{ =~ 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}
(??{ =~ 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}
(??{ =~ tr/LOP/ABC/r })
AAAABB[UXZ]{1})
}x) {print "\n";}
我已按照本主题中的答案进行操作,但无法使其中任何一个起作用:How can I find all matches to a regular expression in Perl?
通过使用 while <text>
,您可以在循环的每次迭代中从文件句柄读取一个新文件。您需要循环,一个遍历行,一个内循环遍历匹配项。
while (my $line = <text>) {
push @matches, while $line
=~ m{
([TR]{6}
JFUA
[ABR]
GAFG
( [LOP]{2,3} )
[KW]{2,5}
(??{ =~ tr/LOP/ABC/r })
AAAABB[UXZ])
}xg;
}
我还删除了 {1}
,因为它没用,使用 $1 而不是 $&,因为 $& 对您在程序中所做的所有匹配施加了不利的性能;并删除 /g
并将 g
添加到正确的位置(即 }x
旁边)。
测试时,我从这里复制'n'粘贴输入,即所有字符都在一行中。如果您的输入不同,请使用它的代码格式,而不是引用。