我正在尝试使用正则表达式将核苷酸序列分成氨基酸串。我必须在每次出现字符串“ATG”时开始一个新字符串,但我不想在“ATG”处实际停止第一场比赛。有效输入是As,Cs,Gs和Ts字符串的任何排序。
例如,给定输入字符串:ATGAACATAGGACATGAGGAGTCA 我应该得到两个字符串:ATGAACATAGGACATGAGGAGTCA(整个事情)和ATGAGGAGTCA(“ATG”之后的第一场比赛)。包含“ATG”n次的字符串应该会得到n个结果。
我认为表达式/(?:[ACGT] *)(ATG)[ACGT] * / g会起作用,但事实并非如此。如果使用正则表达式无法做到这一点,那么只需编写代码就足够了,但如果可以的话,我总是更喜欢优雅的解决方案。
答案 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
分为GGG
,ATGTTT
,ATGGGG
和ATGCCC
。
所以现在你有一个(在这种情况下是四个)字符串的数组。我现在去拿那些,丢弃第一个(这个将永远不会包含,也不会以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
,则会返回ATGabcdefghijATGklmnoATGpqrs
,ATGklmnoATGpqrs
和ATGpqrs
。