如何匹配(最好是在perl中)与查询字符串匹配的所有字符串,除了一个字符?
查询:TLAQLLLDK
想要匹配:xLAQLLLDK
,TxAQLLLDK
,TLxQLLLDK
等。
在哪里' x'是任何大写字母' [A-Z]'。
答案 0 :(得分:0)
使用交替运算符。
^(?:[A-Z]LAQLLLDK|T[A-Z]AQLLLDK|TL[A-Z]QLLLDK|.....)$
同样填写所有..
答案 1 :(得分:0)
你可以通过编写一个可怕的正则表达式来实现这一点,这个正则表达式的构建速度非常慢,执行起来甚至更慢,或者你可以不使用正则表达式来做这些事情并编写一个只比较两个字符串字符的函数在字符之后,允许一个“错误”并且只有在恰好有一个错误时才返回True。
答案 2 :(得分:0)
如何匹配(最好是在perl中)与查询字符串匹配的所有字符串,除了一个字符?
通过在运行时动态生成所需的正则表达式来扩展@Avinash的答案:
my $query = 'TLAQLLLDK';
my $re_proto = '(' . join( '|', map { (my$x=$query)=~s/^(.{$_})./$1\[A-Za-z]/; $x; } (0 .. length($query)-1) ) . ')';
my $re = qr/^$re_proto$/;
my @input = qw(xLAQLLLDK TxAQLLLDK TLxQLLLDK);
my @matches = grep { /$re/ } @input;
print "@matches\n";
(我也必须包含[a-z]
,因为您的示例输入使用x
作为标记。)
如果你需要经常这样做,我会建议缓存生成的正则表达式。
答案 3 :(得分:0)
这是你在找什么?
#!/usr/bin/perl
use strict;
my @str = ("ULAQLLLDK","TAAQLLLDK","TLCQLLLDK","TLAQLLLDK");
while(<@str>){
if (/[A-S,U-Z]LAQLLLDK|T[A-K,M-Z]AQLLLDK|TL[B-Z]QLLLDK/ ){
print "$_\n";
}
}
输出:
ULAQLLLDK
TAAQLLLDK
TLCQLLLDK
答案 4 :(得分:0)
只有9 x 25 = 225个这样的字符串,所以您也可以将它们全部生成并将它们放入哈希值进行比较
use strict;
use warnings;
use 5.010;
my %matches;
my $s = 'TLAQLLLDK';
for my $i (0 .. length($s) - 1) {
my $c = substr $s, $i, 1;
for my $cc ('A' .. 'Z') {
substr(my $ss = $s, $i, 1) = $cc;
++$matches{$ss} unless $cc eq $c;
}
}
printf "%d matches found\n", scalar keys %matches;
for ( qw/ TLAQLLLDK TLAQLXLDK / ) {
printf "\$matches{%s} = %s\n", $_, $matches{$_} // 'undef';
}
<强>输出强>
225 matches found
$matches{TLAQLLLDK} = undef
$matches{TLAQLXLDK} = 1