正则表达式Capture和Backrefence

时间:2013-05-04 21:24:07

标签: regex perl

这是我正在搜索的字符串。

T+4ACCGT+12CAAGTACTACCGT+12CAAGTACTACCGT+4ACCGA+6CTACCGT+12CAAGTACTACCGT+12CAAGTACTACCG

我想捕获X位数字后面的数字(X是前一个数字)我还想捕获完整的字符串。

即捕获应返回:

+4ACCG
+12AAGTACTACCGT
etc.

和:

ACCG
AAGTACTACCGT
etc.

这是我正在使用的正则表达式:

(\+(\d+)([ATGCatgcnN]){\2});

我使用1美元和3美元进行捕获。

我错过了什么?

3 个答案:

答案 0 :(得分:3)

您无法在量词中使用反向引用\1是与$1包含的内容相匹配的说明,因此{\1}不是有效的量词。但为什么你需要匹配确切的数字?只需匹配字母(因为下一部分再次以+开始)。

所以试试:

(\+\d+([ATGCatgcnN]+));

并找到$1中的完整匹配和$2

中的字母

你的正则表达式中的另一个问题是你的量词在你的第三个捕获组之外。这样只有最后一个字母才会出现在捕获组中。将量词放在组内以捕获整个序列。

您还可以使用i修饰符来匹配大小写独立来删除班级中的大写或小写字母:

/(\+\d+([ATGCN]+))/gi

答案 1 :(得分:1)

这个循环有效,因为\G断言告诉正则表达式引擎在字符串中的最后一个匹配(数字)之后开始搜索。

$_ = 'T+4ACCGT+12CAAGTACTACCGT+12CAAGTACTACCGT+4ACCGA+6CTACCGT+12CAAGTACTACCGT+12CAAGTACTACCG';

while (/(\d+)/g) {
    my $dig = $1;
    /\G([TAGCN]{$dig})/i;
    say $1;
}

结果

ACCG
CAAGTACTACCG
CAAGTACTACCG
ACCG
CTACCG
CAAGTACTACCG
CAAGTACTACCG

我认为这是正确的但不确定: - |

更新:添加了\G断言,告诉正则表达式在最后一个匹配的号码后立即开始。

答案 2 :(得分:0)

my @sequences = split(/\+/, $string);

for my $seq (@sequences) {
    my($bases) = $seq =~ /([^\d]+)/;
}