Sono abbastanza sicuro dopo aver passato la notte a cercare una risposta che non è possibile, e ho sviluppato un lavoro in giro - ma, se qualcuno conosce un metodo migliore, mi piacerebbe sentirlo ...JavaScript regex i riferimenti indietro che restituiscono una serie di corrispondenze dal singolo gruppo di acquisizione (più gruppi)
Ho passato molte iterazioni sul codice, e il seguente è solo una linea di pensiero. Ad un certo punto stavo usando il flag globale, credo, in modo per match() al lavoro, e non mi ricordo se era necessario ora o meno.
var str = "@[email protected]@ghi&jkl";
var regex = /^(?:@([a-z]+))?(?:&([a-z]+))?$/;
L'idea qui, in questo codice semplificato, è il gruppo opzionale 1, di cui v'è una quantità specificata, corrisponderà @abc, @def e @ghi. Catturerà solo i caratteri alfa di cui ce ne sarà uno o più. Gruppo 2 è lo stesso, tranne corrispondenze su & simbolo. Dovrebbe anche essere ancorato all'inizio e alla fine della stringa.
Voglio essere in grado di eseguire tutte le partite di riferimento di entrambi i gruppi, vale a dire:
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
Il mio compagno dice che questo funziona bene per lui in .net, purtroppo non riesco a farlo funzionare - solo l'ultima corrispondenza di qualsiasi gruppo viene restituito nel riferimento posteriore, come si può vedere nella seguente:
(aggiuntivo, rendendo entrambi i gruppi opzionale rende un disastro, come fa impostazione flag globale)
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
Quello che segue è la soluzione sono arrivato al, catturando tutta la parte in questione, e creare l'array stesso:
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
Grazie per la risposta. Pensavo che potesse esserci una soluzione più elegante. http://stackoverflow.com/a/1412662/1455709 è stata la risposta più vicina che sono riuscito a trovare, tuttavia non ha avuto successo quando ho complicato l'espressione e la scarpa mi ha incastrato in quello che cercavo ... – Patrick
Prego. Buona fortuna! – Pointy