Javascript regular exp:引用嵌套组

时间:2014-07-08 05:31:44

标签: javascript regex

所以我得到了这个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!

2 个答案:

答案 0 :(得分:0)

我的回答解决了您的what did I miss?问题。有关解决方法,请参阅answer by @Jack

捕获组不是子程序

您缺少的是捕获组不是子例程。

当您说\1时,您指的是第1组括号中捕获的确切字符。例如,(\d)\1将匹配1122 ,但不是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]);
}