JavaScript正则表达式反向引用从单个捕获组(多个组)返回匹配的数组

5

经过一晚上的尝试,我相当确定这是不可能的,并且我已经开发了一个解决方法 - 但是,如果有人知道更好的方法,我很乐意听取...

我已经对代码进行了许多迭代,以下只是一种思路。在某个时候,我使用了全局标志,为了让match()函数正常工作,我记不清现在是否必要了。

var str = "@abc@def@ghi&jkl";
var regex = /^(?:@([a-z]+))?(?:&([a-z]+))?$/;

这里的简化代码中,可选组1会匹配@abc、@def和@ghi,其中数量不确定。它只会捕获至少一个字母字符。组2也是同样的,只是匹配了&符号。这两个组应该被锚定在字符串的开头和结尾。
我想能够回溯这两个组的所有匹配,即:
result = str.match(regex);
alert(result[1]); //abc,def,ghi
alert(result[1][0]); //abc
alert(result[1][1]); //def
alert(result[1][2]); //ghi
alert(result[2]); //jkl

我的朋友说这在.net上很好用,但不幸的是我无法使它工作-只有任何一个组中最后匹配的内容会在反向引用中返回,如下所示:

(另外,将任一组设为可选会造成混乱,设置全局标志也是如此)

var str = "@abc@def@ghi&jkl";
var regex = /(?:@([a-z]+))(?:&([a-z]+))/;

var result = str.match(regex);

alert(result[1]); //ghi
alert(result[1][0]); //g
alert(result[2]); //jkl

以下是我得出的解决方案,捕获整个部分,并自己创建数组:
var str = "@abc@def@ghi&jkl";
var regex = /^([@a-z]+)?(?:&([a-z]+))?$/;

var result = regex.exec(str);

alert(result[1]); //@abc@def@ghi
alert(result[2]); //jkl

var result1 = result[1].toString();
result[1] = result1.split('@')

alert(result[1][1]); //abc
alert(result[1][2]); //def
alert(result[1][3]); //ghi
alert(result[2]); //jkl
1个回答

4
这并不是 JavaScript 中 .match() 的工作方式。返回的数组是一组简单的字符串,没有捕获组的“嵌套”,只需从左到右计算(符号即可。
第一个字符串(索引为[0])始终是整个匹配的字符串。然后是捕获组,每个数组元素都是一个字符串(或null)。
您可以像您所做的那样重新排列结果数组。它只是一个数组。 编辑 - 哦,你的 result[1][0] 之所以是 "g",是因为应用于字符串的数组索引表示法获取字符串的各个字符。

感谢回复。我原以为可能会有更优雅的解决方案。http://stackoverflow.com/a/1412662/1455709 是我找到的最接近的答案,但当我将其复杂化并塞进我想要的东西时却没有成功... - Patrick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接