2012-08-09 12 views
5

Ich bin ziemlich sicher nach der Nacht zu versuchen, eine Antwort zu finden, dass dies nicht möglich ist, und ich habe eine Arbeit entwickelt um - aber, wenn jemand eine bessere Methode kennt, würde ich es lieben hören ...JavaScript Regex zurück Referenzen ein Array von Übereinstimmungen aus einzelnen Capture-Gruppe (mehrere Gruppen) zurück

Ich habe viele Wiederholungen auf den Code durchlaufen, und das folgende ist nur eine Gedankenreihe wirklich. Irgendwann habe ich, glaube ich, die globale Flagge benutzt, damit match() funktioniert, und ich kann mich nicht erinnern, ob es jetzt notwendig war oder nicht.

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

Die Idee hier, in diesem vereinfachten Code ist die optionale Gruppe 1, von denen es eine unbestimmte Menge ist, wird @abc übereinstimmen, @dEF und @ghi. Es werden nur die Alpha-Zeichen erfasst, von denen eines oder mehrere vorhanden sind. Gruppe 2 ist die gleiche, außer Übereinstimmungen auf & Symbol. Es sollte auch am Anfang und am Ende der Zeichenfolge verankert sein.

Ich möchte in der Lage sein, anhand der beiden Gruppen alle Spiele zu unterstützen, das heißt:

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 

Mein Kumpel sagt ihm dies in .net funktioniert gut, leider kann ich es einfach nicht an die Arbeit - nur die letzte in einer Gruppe zusammengebracht wird in der Rückseite Referenz zurückgegeben, wie in der zu sehen ist folgende:

(zusätzlich entweder machen Gruppe optional ein Chaos macht, als globales flag tut Einstellung)

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 

Das Folgende ist die Lösung, die ich an kam, den ganzen Teil in Frage erfassen, und die Schaffung der Array selbst:

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 

Antwort

4

Das ist einfach nicht, wie .match() Werke in JavaScript. Das zurückgegebene Array ist ein Array einfacher Strings. Es gibt keine "Verschachtelung" von Fanggruppen; Sie zählen nur die ( Symbole von links nach rechts.

Die erste Zeichenfolge (bei Index [0]) ist immer die übereinstimmende Gesamtzeichenfolge. Dann kommen die Capture-Gruppen, eine Zeichenfolge (oder null) pro Array-Element.

Sie können, wie Sie es getan haben, das Ergebnis-Array nach Herzenslust neu anordnen. Es ist nur ein Array.

bearbeiten — oh, und der Grund, Ihre result[1][0] „g“ ist, dass Array-Indizierung Notation auf einen String angewendet wurde bekommt man die einzelnen Zeichen des Strings.

+0

Danke für die Antwort. Ich dachte, es könnte eine elegantere Lösung gegeben haben. http://StackOverflow.com/a/1412662/1455709 war die nächste Antwort, die ich finden konnte, hatte jedoch keinen Erfolg, wenn es den Ausdruck und Schuh-Horn es in das verkompliziert, was ich nach ... war – Patrick

+0

Gern geschehen. Viel Glück! – Pointy