Perl - 字符串匹配问题

时间:2014-06-09 09:13:33

标签: regex perl

我有一个我无法理解的问题。我有这个字符串:

gene_id "siRNA_Z27kG1_20543"transcript_id "siRNA_Z27kG1_20543_X_1";tss_id "TSS124620"

我想改变gene_id。所以,我有以下代码:

if ($line =~ /;transcript_id "([A-Za-z0-9:\-._]*)(_[oxOX][_.][0-9]*)";/) {
    $num = $2;
    $line =~ s/gene_id "([A-Za-z0-9:\-._]*)";/gene_id "$1$num";/g;
    print $new $line."\n";
}

我的代码的目的是更改siRNA_Z27kG1_20543的{​​{1}}。但是,我的代码不会产生该输出。为什么?我无法理解。

我的正则表达式需要保持原样,因为我匹配其他字符串(这次是成功的)。

2 个答案:

答案 0 :(得分:1)

#!/usr/bin/perl
use strict;
use warnings;
my $string = q{gene_id "siRNA_Z27kG1_20543"transcript_id "siRNA_Z27kG1_20543_X_1";tss_id "TSS124620"};
if($string =~ m|transcript_id "([A-Za-z0-9:\-._]*)(_[oxOX][_.][0-9]*)"|){
    my $replace_with = qq{gene_id "$1$2"};
    $string =~ s/gene_id (\"\w+\")/$replace_with/g;
}
print "$string";

输出:gene_id "siRNA_Z27kG1_20543_X_1"transcript_id "siRNA_Z27kG1_20543_X_1";tss_id "TSS124620"

Demo

答案 1 :(得分:0)

删除模式开头的分号,因为字符串中不存在分号: -

if ($line =~ /transcript_id "([A-Za-z0-9:\-._]*)(_[oxOX][_.][0-9]*)";/) {
            $num = $2;
            $line =~ s/gene_id "([A-Za-z0-9:\-._]*)";/gene_id "$1$num";/g;
            print $new $line."\n";
        }