如何制作正则表达式来评估以下字符串?
TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC
并提取模式CTCCT.
模式必须是3 C和2 T的任何顺序.
我试过/ [C | T] {5} /但它与CCCCT和TCCCC相匹配
提前致谢.
计算“CTCCT”的所有排列并将它们连接到正则表达式:
CCCTT|CCTCT|CCTTC|CTCCT|CTCTC|CTTCC|TCCCT|TCCTC|TCTCC|TTCCC
Run Code Online (Sandbox Code Playgroud)
该模式可以优化:
C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)
Run Code Online (Sandbox Code Playgroud)
CCCTT|CCTCT|CCTTC|CTCCT|CTCTC|CTTCC|TCCCT|TCCTC|TCTCC|TTCCC
Run Code Online (Sandbox Code Playgroud)
该模式找不到重叠的匹配项,例如 中只有一个匹配项CCCTTCCC。
要查找重叠匹配,请使用前瞻:
C(?=C(?=T(?=CT|TC)|CTT)|T(?=C(?=CT|TC)|TCC))|T(?=C(?=C(?=CT|TC)|TCC)|TCCC)
Run Code Online (Sandbox Code Playgroud)
C(?:C(?:T(?:CT|TC)|CTT)|T(?:C(?:CT|TC)|TCC))|T(?:C(?:C(?:CT|TC)|TCC)|TCCC)
Run Code Online (Sandbox Code Playgroud)
正则表达式只能处理相当有限的排列。如果您想匹配可能任意大小的段,请使用非正则表达式解决方案:
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));Run Code Online (Sandbox Code Playgroud)
或者与上面相同,就像生成器逐步遍历所有可能重叠的匹配一样:
C(?=C(?=T(?=CT|TC)|CTT)|T(?=C(?=CT|TC)|TCC))|T(?=C(?=C(?=CT|TC)|TCC)|TCCC)
Run Code Online (Sandbox Code Playgroud)
性能对比: https: //jsfiddle.net/24qguege/7/
火狐 47: