经过一晚上的尝试,我相当确定这是不可能的,并且我已经开发了一个解决方法 - 但是,如果有人知道更好的方法,我很乐意听取...
我已经对代码进行了许多迭代,以下只是一种思路。在某个时候,我使用了全局标志,为了让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