如何在 Perl 的整个匹配输出中突出显示捕获组(例如,用括号括起来)
How to highlight capture groups (e.g. with brackets around them) in the entire match output in Perl
我有以下代码,它成功地将所有与我的正则表达式匹配的字符串打印到控制台 (perl myscript.pl sample_text.txt
)。
$filename=shift;
open text, $filename or die "error opening $filename\n";
while (my $line = <text>) {
push @matches, while $line
=~ m{
(( [ACGT]{6} )
CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ =~ tr/ACGT/TGCA/r })
( CGAAA[ACGT] ))
}xgi;
}
print "$_\n" for @matches;
(这只是我的正则表达式的简化版本,我的捕获组要复杂得多,而且没有固定长度。)
我的sample_text可以下载here.
我希望输出保持原样(每行一个匹配),但我想要匹配 first ( [ACGT]{6} )
和 [= 的子字符串35=]last ( CGAAA[ACGT] )
在我的正则表达式中捕获组,以便在控制台中打印整个匹配项时将它们括起来。
举个例子,当我 运行 上面的整个脚本在我附加的示例文件 (sample_text
) 上时,我得到的匹配结果之一是:
TTTATGCTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTTCGAAAA
我反而想看到这样的输出:
(TTTATG)CTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTT(CGAAAA)
push @matches, "()()"
while
$line =~ m{
( [ACGT]{6} )
( CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ =~ tr/ACGT/TGCA/r })
)
( CGAAA [ACGT] )
}xgi;
使用命名捕获:
#push @matches, sprintf "(%s)%s(%s)", @+{qw( pre main suf )}
push @matches, "($+{pre})$+{main}($+{suf})"
while
$line =~ m{
(?<pre> [ACGT]{6} )
(?<main> CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ $^N =~ tr/ACGT/TGCA/r })
)
(?<suf> CGAAA [ACGT] )
}xgi;
我有以下代码,它成功地将所有与我的正则表达式匹配的字符串打印到控制台 (perl myscript.pl sample_text.txt
)。
$filename=shift;
open text, $filename or die "error opening $filename\n";
while (my $line = <text>) {
push @matches, while $line
=~ m{
(( [ACGT]{6} )
CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ =~ tr/ACGT/TGCA/r })
( CGAAA[ACGT] ))
}xgi;
}
print "$_\n" for @matches;
(这只是我的正则表达式的简化版本,我的捕获组要复杂得多,而且没有固定长度。)
我的sample_text可以下载here.
我希望输出保持原样(每行一个匹配),但我想要匹配 first ( [ACGT]{6} )
和 [= 的子字符串35=]last ( CGAAA[ACGT] )
在我的正则表达式中捕获组,以便在控制台中打印整个匹配项时将它们括起来。
举个例子,当我 运行 上面的整个脚本在我附加的示例文件 (sample_text
) 上时,我得到的匹配结果之一是:
TTTATGCTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTTCGAAAA
我反而想看到这样的输出:
(TTTATG)CTGATGAGAAAAAACATAAGAAAACGTATAATTTTTTCTAAAAAAGGAAAAAAGACCGAAATTTTAAGCTGTTTTT(CGAAAA)
push @matches, "()()"
while
$line =~ m{
( [ACGT]{6} )
( CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ =~ tr/ACGT/TGCA/r })
)
( CGAAA [ACGT] )
}xgi;
使用命名捕获:
#push @matches, sprintf "(%s)%s(%s)", @+{qw( pre main suf )}
push @matches, "($+{pre})$+{main}($+{suf})"
while
$line =~ m{
(?<pre> [ACGT]{6} )
(?<main> CTGA
[ACGT]
GAG
( [ACGT]{3,6} )
[ACGT]{2,100}
(??{ $^N =~ tr/ACGT/TGCA/r })
)
(?<suf> CGAAA [ACGT] )
}xgi;