2012-08-09 23 views
5

我相当确信在花了一夜试图找到答案,这是不可能的,我已经开发了一个工作 - 但是,如果有人知道更好的方法,我很乐意听到它...JavaScript正则表达式返回引用返回来自单个捕获组(多个组)的匹配数组

我已经经历了很多关于代码的迭代,以下只是真正的思路。我相信,在某些时候,我使用全局标志来匹配match(),我不记得现在是否有必要。

var str = "@[email protected]@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 = "@[email protected]@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 = "@[email protected]@ghi&jkl"; 
var regex = /^([@a-z]+)?(?:&([a-z]+))?$/; 

var result = regex.exec(str); 

alert(result[1]); //@[email protected]@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 

回答

4

这根本不是如何.match()作品在JavaScript中。返回的数组是一串简单的字符串。捕捉组没有“嵌套”;你只需要从左到右数字(

第一个字符串(索引[0])始终是总体匹配的字符串。然后来捕获组,每个数组元素的一个字符串(或null)。

就像你所做的那样,你可以重新排列结果数组到你心中的内容。这只是一个数组。

编辑 —哦,你的result[1][0]是原因“G”是适用于字符串数组索引符号让你的字符串的单个字符。

+0

感谢您的回复。我认为可能有更优雅的解决方案。 http://stackoverflow.com/a/1412662/1455709是我能找到的最接近的答案,但是当表达式变得复杂并且鞋子变成我之后的东西时,它没有成功... – Patrick 2012-08-09 16:15:13

+0

不客气。祝你好运! – Pointy 2012-08-09 16:16:49

相关问题