2012-08-09 8 views
5

Jestem dość pewny po spędzeniu nocy próbując znaleźć odpowiedź, że nie jest to możliwe, i opracowałem pracę - ale jeśli ktoś wie o lepszej metodzie, chciałbym to usłyszeć ...JavaScript regex zwraca odnośniki zwracając tablicę dopasowań z pojedynczej grupy przechwytywania (wiele grup)

Przeszedłem wiele iteracji na kodzie, a poniżej jest tylko linia myślenia naprawdę. W pewnym momencie używałem globalnej flagi, jak sądzę, aby funkcja match() działała i nie pamiętam, czy było to teraz konieczne, czy nie.

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

Chodzi tu, w tym kodzie uproszczonej, jest opcjonalna grupa 1, której nie ma nieokreśloną kwotę, będzie pasował @abc, @def i @ghi. Przechwyci tylko znaki alfa, z których będzie jeden lub więcej. Grupa 2 jest taka sama, z wyjątkiem meczów pod symbolem &. Powinien również zostać zakotwiczony na początku i końcu łańcucha.

Chcę być w stanie wykonać kopię referencyjne mecze obu grup, tj:

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 

Mój kolega mówi, że to działa dobrze dla niego w .NET, niestety po prostu nie mogę zmusić go do pracy - tylko ostatni dopasowane każdej grupie jest zwracany w odniesieniu tyłu, jak widać poniżej:

(dodatkowo, dzięki czemu zarówno grupa opcja sprawia, że ​​bałagan, podobnie jak ustawienie globalne flag)

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 

Poniżej znajduje się rozwiązanie I przybył, zdobywając całą część w pytaniu i tworząc tablicę sobie:

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 

Odpowiedz

4

To nie jest po prostu how .match() prace w JavaScripcie. Zwrócona tablica to tablica prostych łańcuchów. Nie ma "zagnieżdżania" grup chwytających; po prostu policz symbole ( od lewej do prawej.

Pierwszy ciąg (w indeksie [0]) jest zawsze dopasowanym łańcuchem. Następnie przyjmij grupy przechwytywania, jeden ciąg (lub null) na element tablicy.

Możesz, tak jak to uczyniłeś, zmienić układ wyników na zawartość twojego serca. To tylko tablica.

edit — oh, a powodem była twoja result[1][0] „g” jest to, że notacja stosowana do indeksowania tablicy ciąg dostaje poszczególne znaki łańcucha.

+0

Dzięki za odpowiedź. Myślałem, że mogło być bardziej eleganckie rozwiązanie. http://stackoverflow.com/a/1412662/1455709 była najbliższą odpowiedzią, jaką udało mi się znaleźć, ale nie odniosłem sukcesu, komplikując wyrażenia i klapsy butów w to, co było po ... – Patrick

+0

Nie ma za co. Powodzenia! – Pointy

Powiązane problemy