2012-08-09 24 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

相關問題