所以我得到了这个RegExp来验证这样的输入:
1 12919840 T C
1 35332717 C A
1 55148456 G T
1 70504789 C T
1 167059520 A T
1 182496864 A T
1 197073351 C T
1 216373211 G T
我提出的exp是:
/^([0-9]\s+[0-9]+\s+[ATCG]\s+[ATCG][\s|\n]+)*[0-9]\s+[0-9]+\s+[ATCG]\s+[ATCG][\s|\n]*$/g
这有点像
/^([0-9]\s+[0-9]+\s+[ATCG]\s+[ATCG][\s|\n]+)*[0-9]\s+[0-9]+\s+[ATCG]\s+[ATCG][\s|\n]*$/g.test("1 12919840 T C\n1 35332717 C A"); //this returns true
但是当尝试使用组引用使其缩短时它不再起作用
/^(([0-9]\s+[0-9]+\s+[ATCG]\s+[ATCG])[\s|\n]+)*\2[\s|\n]*$/g.test("1 12919840 T C\n1 35332717 C A"); //this returns false
我在这里使用\2
,因为从我的研究中,群组的编号从最左边的括号开始。我错过了什么? THX!
答案 0 :(得分:0)
我的回答解决了您的what did I miss?
问题。有关解决方法,请参阅answer by @Jack。
捕获组不是子程序
您缺少的是捕获组不是子例程。
当您说\1
时,您指的是第1组括号中捕获的确切字符。例如,(\d)\1
将匹配11
或22
,但不是12
。
正则表达式子程序
在Perl和PCRE
中,您可以使用(?1)
来引用子表达式。例如,(\d)(?1)
将匹配11
以及12
。
这也适用于Python的regex
模块。遗憾的是,JavaScript似乎没有使用它。
由于您正在使用DNA
,如果您有机会,我建议您使用Python这样的生命周期语言(JS的正则表达式能力很差,尽管XregeExp
库填补了一些漏洞。)
答案 1 :(得分:0)
表达式的问题在于后引用匹配先前内存捕获所匹配的内容;生成内存捕获本身的表达式不能以这种方式引用。
也就是说,你仍然可以通过在表达式上使用乘数来缩短表达式:
var re = /((?:^\d+\s+\d+\s+[TCGA]\s+[TCGA][\s\r\n]*){2})/gm,
m;
表达式匹配相同的东西两次,中间有一组可选的空格。迭代所有匹配:
while ((m = re.exec(str)) !== null) {
console.log('match' + m[1]);
}