使用Regexp在JS中拆分核苷酸序列

时间:2010-06-15 20:01:14

标签: javascript regex

我正在尝试使用正则表达式将核苷酸序列分成氨基酸串。我必须在每次出现字符串“ATG”时开始一个新字符串,但我不想在“ATG”处实际停止第一场比赛。有效输入是As,Cs,Gs和Ts字符串的任何排序。

例如,给定输入字符串:ATGAACATAGGACATGAGGAGTCA 我应该得到两个字符串:ATGAACATAGGACATGAGGAGTCA(整个事情)和ATGAGGAGTCA(“ATG”之后的第一场比赛)。包含“ATG”n次的字符串应该会得到n个结果。

我认为表达式/(?:[ACGT] *)(ATG)[ACGT] * / g会起作用,但事实并非如此。如果使用正则表达式无法做到这一点,那么只需编写代码就足够了,但如果可以的话,我总是更喜欢优雅的解决方案。

5 个答案:

答案 0 :(得分:2)

如果你真的想使用正则表达式,试试这个:

var str = "ATGAACATAGGACATGAGGAGTCA",
    re = /ATG.*/g, match, matches=[];
while ((match = re.exec(str)) !== null) {
    matches.push(match);
    re.lastIndex = match.index + 3;
}

但请注意exec并更改索引。你可以轻松地使它成为无限循环。

否则,您可以使用indexOf查找索引,使用substr来获取子字符串:

var str = "ATGAACATAGGACATGAGGAGTCA",
    offset=0, match=str, matches=[];
while ((offset = match.indexOf("ATG", offset)) > -1) {
    match = match.substr(offset);
    matches.push(match);
    offset += 3;
}

答案 1 :(得分:1)

我想你想要的是

var subStrings = inputString.split('ATG');

KISS:)

答案 2 :(得分:1)

在每次出现ATG之前拆分字符串很简单,只需使用

即可
result = subject.split(/(?=ATG)/i);

(?=ATG)是一个积极的先行断言,意思是“断言你可以从字符串中的当前位置开始匹配ATG。”

这会将GGGATGTTTATGGGGATGCCC分为GGGATGTTTATGGGGATGCCC

所以现在你有一个(在这种情况下是四个)字符串的数组。我现在去拿那些,丢弃第一个(这个将永远不会包含,也不会以ATG开头)然后加入字符串no。 2 + ... + n,然后是3 + ... + n等,直到您用尽了清单。

当然,这个正则表达式不会对字符串是否仅包含ACGT字符进行任何验证,因为它只匹配字符之间的位置,因此应该在之前完成,i。即输入字符串与/^[ACGT]*$/i匹配。

答案 3 :(得分:0)

由于你想要从每个“ATG”捕捉到最终分裂不适合你。但是,您可以使用replace并滥用回调函数:

var matches = [];
seq.replace(/atg/gi, function(m, pos){ matches.push(seq.substr(pos)); });

答案 4 :(得分:0)

这不是正则表达式,我不知道这是否是你认为的“优雅”,但是......

var sequence = 'ATGAACATAGGACATGAGGAGTCA';
var matches = [];
do {
    matches.push('ATG' + (sequence = sequence.slice(sequence.indexOf('ATG') + 3)));
} while (sequence.indexOf('ATG') > 0);

我不完全确定这是否是您正在寻找的。例如,如果输入字符串为ATGabcdefghijATGklmnoATGpqrs,则会返回ATGabcdefghijATGklmnoATGpqrsATGklmnoATGpqrsATGpqrs