标签:javascript regex
如何制作正则表达式来评估以下字符串?
TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC
并提取模式CTCCT.
模式必须是3 C和2 T的任何顺序.
我试过/ [C | T] {5} /但它与CCCCT和TCCCC相匹配
提前致谢.
解决方法:
计算“CTCCT”的所有排列并将它们连接到正则表达式:
CCCTT|CCTCT|CCTTC|CTCCT|CTCTC|CTTCC|TCCCT|TCCTC|TCTCC|TTCCC
此模式可以是optimized:
C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)
var regex = new RegExp(/C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)/g);
var string = "TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC";
console.log(regex.exec(string));
此模式未找到重叠匹配,例如: G.在CCCTTCCC中只会有一场比赛.
要查找重叠匹配,请使用前瞻:
C(?=C(?=T(?=CT|TC)|CTT)|T(?=C(?=CT|TC)|TCC))|T(?=C(?=C(?=CT|TC)|TCC)|TCCC)
var regex = new RegExp(/C(?=C(?=T(?=CT|TC)|CTT)|T(?=C(?=CT|TC)|TCC))|T(?=C(?=C(?=CT|TC)|TCC)|TCCC)/g);
var string = "CCCTTCCC";
while ((match = regex.exec(string)) != null) {
console.log(match.index, string.substring(match.index, match.index + 5));
}
正则表达式只能处理相当有限数量的排列.如果要匹配可能任意大小的段,请使用非正则表达式解决方案:
function c3t2_optimized(str) {
var c = 0, t = 0;
for (var i = 0; i < str.length; ++i) {
var last = str.charAt(i);
if (last == 'C') ++c;
else if (last == 'T') ++t;
if (i > 4) {
var first = str.charAt(i - 5);
if (first == 'C') --c;
else if (first == 'T') --t;
}
if (c == 3 && t == 2) return i - 4;
}
return -1;
}
var string = "TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC";
console.log(c3t2_optimized(string));
或者与上面相同,就像一个生成器逐步完成所有可能重叠的匹配:
function* c3t2_optimized(str) {
var c = 0, t = 0;
for (var i = 0; i < str.length; ++i) {
var last = str.charAt(i);
if (last == 'C') ++c;
else if (last == 'T') ++t;
if (i > 4) {
var first = str.charAt(i - 5);
if (first == 'C') --c;
else if (first == 'T') --t;
}
if (c == 3 && t == 2) yield i - 4;
}
}
var string = "CCCTTCCC";
for (i of c3t2_optimized(string)) {
console.log(i, string.substring(i, i + 5));
}
表现比较:https://jsfiddle.net/24qguege/7/
Firefox 47:
> 68.83ms – 正则表达式(见上文)
> 97.51ms – 非正则表达式(见上文)
> 9582.39ms – Andrew Rueckert’s answer(更好的可读性)
标签:javascript,regex 来源: https://codeday.me/bug/20190519/1134982.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。