2016-05-03 12 views
9

Ich muss mehrere Gruppen des gleichen Musters erfassen. Nehmen wir an, ich habe eine folgende Zeichenfolge:Wie werden mehrere wiederholte Gruppen erfasst?

HELLO,THERE,WORLD 

und ich habe folgendes Muster

geschrieben
^(?:([A-Z]+),?)+$ 

Was ich will, ist zu tun, jedes einzelne Wort zu erfassen, so dass Gruppe 1 lautet: " HALLO ", Gruppe 2 ist" DORT "und Gruppe 3 ist" WELT "Was meine Regex eigentlich nur die letzte, die" WORLD "ist.

ich meinen regulären Ausdruck here bin Tests und ich möchte es mit Swift verwenden (vielleicht ist es eine Möglichkeit, in Swift irgendwie Zwischenergebnisse zu bekommen, so dass ich sie nicht verwenden kann?)

UPDATE: I don‘ Ich möchte split verwenden. Ich muss jetzt nur noch alle Gruppen erfassen, die dem Muster entsprechen, nicht nur das letzte.

+0

warum nicht auf '' '? – rock321987

+0

Warum nicht '[A-Z] +' oder '[^,] +' verwenden, um die Ergebnisse zu erfassen – rock321987

+0

rock321987, Ich habe die Eingabezeichenfolge aktualisiert. Ich muss genau die Zeichenfolge extrahieren, die dem obigen Muster folgt. Und ich muss dafür sorgen, dass alle Gruppen dem Muster entsprechen, nicht nur das letzte. Ich möchte wissen, wie man es mit Regex macht. – phbelov

Antwort

12

Mit einer Gruppe im Muster können Sie nur ein genaues Ergebnis in dieser Gruppe erhalten. Wenn Ihre Erfassungsgruppe nach dem Muster wiederholt wird (Sie haben den Quantifizierer + für die umgebende nicht erfassende Gruppe verwendet), wird nur der letzte Wert gespeichert, der diesem entspricht.

Sie haben Ihre Sprache regex Implementierung Funktionen bedienen alle eines Muster übereinstimmt, dann würden Sie die Anker und die quantifier der Nicht-Erfassung Gruppe entfernen müssen (und man konnte die Nicht-Erfassung Gruppe weglassen selbst auch).

Alternativ erweitern Sie Ihre regex und lassen Sie das Muster enthalten eine Erfassungsgruppe pro Gruppe möchten Sie im Ergebnis erhalten:

^([A-Z]+),([A-Z]+),([A-Z]+)$ 
+0

Wie würde dies angepasst werden, um eine variierende Anzahl von Strings zu berücksichtigen? z.B. HALLO, WELT und HALLO, DORT, MEINE, WELT. Ich suche nur einen Ausdruck, um beide Beispiele zu behandeln, und bin flexibel genug für noch längere String-Arrays – Chris

1

Nur weiteres Beispiel des Absatzes 2 in der Antwort zu geben. Ich bin mir nicht sicher, wie wichtig es für Sie ist, drei Gruppen in einem Spiel statt drei Spiele in einer Gruppe zu bekommen. ZB in groovy:

def subject = "HELLO,THERE,WORLD" 
def pat = "([A-Z]+)" 
def m = (subject =~ pat) 
m.eachWithIndex{ g,i -> 
    println "Match #$i: ${g[1]}" 
} 

Match #0: HELLO 
Match #1: THERE 
Match #2: WORLD 
Verwandte Themen