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
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
Nie ma za co. Powodzenia! – Pointy