wake-up-neo.com

Wie erfassen Sie mehrere wiederholte Gruppen?

Ich muss mehrere Gruppen desselben Musters erfassen. Angenommen, ich habe folgende Zeichenfolge:

HELLO,THERE,WORLD

Und ich habe folgendes Muster geschrieben 

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

Ich möchte, dass jedes einzelne Wort erfasst wird. Gruppe 1 lautet also: "HELLO", Gruppe 2 ist "DERE" und Gruppe 3 ist "WELT". WELT".

Ich teste meinen regulären Ausdruck hier und möchte ihn mit Swift verwenden (vielleicht gibt es in Swift eine Möglichkeit, irgendwie Zwischenergebnisse zu erzielen, damit ich sie verwenden kann?)

UPDATE: Ich möchte split nicht verwenden. Ich muss jetzt nur noch alle Gruppen erfassen, die mit dem Muster übereinstimmen, nicht nur die letzte.

28
phbelov

Mit einer Gruppe im Muster erhalten Sie nur ein genaues Ergebnis in dieser Gruppe. Wenn Ihre Capture-Gruppe von dem Muster wiederholt wird (Sie haben den +-Quantifizierer für die umgebende Nicht-Capturing-Gruppe verwendet), wird nur der letzte entsprechende Wert gespeichert.

Sie müssen die Regex-Implementierungsfunktionen Ihrer Sprache verwenden, um find alle Übereinstimmungen eines Musters zu finden, und dann müssen Sie die Anker und den Quantifizierer der Nichterfassungsgruppe entfernen (und Sie könnten die Nichterfassungsgruppe selbst weglassen Gut).

Erweitern Sie alternativ Ihren Regex und lassen Sie das Muster eine Erfassungsgruppe pro Gruppe enthalten, die Sie im Ergebnis erhalten möchten:

^([A-Z]+),([A-Z]+),([A-Z]+)$
23
Byte Commander

Um nur ein weiteres Beispiel für Absatz 2 in der Antwort zu geben. Ich bin nicht sicher, wie wichtig es für Sie ist, drei Gruppen in einem Spiel zu erhalten, anstatt drei Spiele in einer Gruppe. Zum Beispiel 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
1
AndyJ

Ich denke du brauchst so etwas ....

b="HELLO,THERE,WORLD"
re.findall('[\w]+',b)

Was in Python3 zurückgegeben wird

['HELLO', 'THERE', 'WORLD']
0
Tim Seed