我在文本文件中寻找“CCGTCAATTC(A | C)TTT(A | G)AGT”的出现。
$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT';
if ($line=~/$text/){
chomp($line);
$pos=index($line,$text);
}
搜索工作正常,但我无法获得“文字”的排名。 似乎索引不接受正则表达式作为子字符串。
我该怎样才能做到这一点。 感谢
答案 0 :(得分:13)
@-
数组保存上次成功匹配的起始位置的偏移量。第一个元素是整个匹配模式的偏移量,后续元素是带括号的子模式的偏移量。因此,如果您知道匹配,则可以将其偏移量设为$-[0]
。
答案 1 :(得分:2)
您根本不需要使用index
,只需使用正则表达式。在您的正则表达式匹配之前的$line
部分将存储在$`
(或$PREMATCH
,如果您选择使用英语;)。您可以通过检查$`
的长度来获取匹配的索引,然后您可以从$&
(或$MATCH
)变量中获取匹配项:
$text = 'CCGTCAATTC(A|C)TTT(A|G)AGT';
if ($line =~ /$text/) {
$pos = length($PREMATCH);
}
假设您希望$pos
继续匹配$line
的剩余部分,您可以使用$'
(或$POSTMATCH
)变量来获取比赛结束后的$line
。
有关这些特殊变量的详细信息,请参阅http://perldoc.perl.org/perlvar.html。
答案 2 :(得分:1)
根据您的评论,您所看到的就是匹配后直接匹配50个字符。因此,一个简单的解决方案是:
my ($match) = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/;
如您所见,[AG]
相当于A|G
。如果您希望多次匹配,可以在正则表达式上使用数组@matches
和/g
全局选项。 E.g。
my @matches = $line =~ /CCGTCAATTC[AC]TTT[AG]AGT(.{50})/g;
您可以这样做以保持匹配模式:
my ($pattern, $match) = $line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;
或循环:
while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) {
my ($pattern, $match) = ($1, $2);
}
答案 3 :(得分:0)
while ($line =~ /(CCGTCAATTC[AC]TTT[AG]AGT)(.{50})/g;) {
我喜欢它,但;
中没有while
。
我很难找到错误的原因。 T_T。