正则表达式:匹配DNA序列的排列

Rya*_*oan 5 javascript regex

如何制作正则表达式来评估以下字符串?

TGATGCCGTCCCCTCAACTTGAGTGCTCCTAATGCGTTGC

并提取模式CTCCT.

模式必须是3 C和2 T的任何顺序.

我试过/ [C | T] {5} /但它与CCCCT和TCCCC相匹配

提前致谢.

le_*_*e_m 3

计算“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:

  • 68.83ms - 正则表达式(见上文)
  • 97.51ms - 非正则表达式(见上文)
  • 9582.39ms - Andrew Rueckert 的答案(更好的可读性)