2016-05-03 12 views
9

Potrzebuję przechwycić wiele grup tego samego wzoru. Załóżmy, że mam następujący ciąg:Jak przechwytywać wiele powtarzających się grup?

HELLO,THERE,WORLD 

A ja napisałem następujący wzorzec

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

co chcę to zrobić, to uchwycić każde słowo, tak że Grupa 1 to: " HELLO ", Grupa 2 to" TAM ", a Grupa 3 to" WORLD "Co mój regex faktycznie przechwytuje tylko ostatni, czyli" WORLD ".

jestem testowania mojego wyrażenia regularnego here i chcę go używać z Swift (być może istnieje sposób, w Swift, aby uzyskać wyniki pośrednie jakoś tak, że nie mogę ich używać?)

UPDATE: I don” t chcesz użyć split. Po prostu muszę teraz uchwycić wszystkie grupy, które pasują do wzorca, nie tylko ostatniego.

+0

dlaczego nie podzielić na ','? – rock321987

+0

dlaczego nie używać '[A-Z] +' lub '[^,] +' do przechwytywania wyników – rock321987

+0

rock321987, zaktualizowałem ciąg wejściowy. Muszę wyodrębnić dokładnie ciąg następujący po powyższym wzorze. I potrzebuję, aby wszystkie grupy pasowały do ​​wzorca, a nie tylko do ostatniego. Chcę wiedzieć, jak to zrobić z regex. – phbelov

Odpowiedz

12

Z jedną grupą we wzorze można uzyskać tylko jeden dokładny wynik w tej grupie. Jeśli grupa przechwytywania zostanie powtórzona przez wzorzec (użyto kwantyfikatora + w otaczającej grupie, która nie przechwytuje), zostanie zapisana tylko ostatnia dopasowana do niej wartość.

Musisz użyć funkcji wykonawczych regex swój język do znaleźć wszystkie mecze deseniu, potem trzeba by usunąć kotwice i kwantyfikatora o braku przechwytywania grupy (i można pominąć grupę non-przechwytywania także sama).

Alternatywnie, poszerzyć swoją regex i niech wzór zawiera jedną grupę przechwytywania na grupę chcesz uzyskać w wyniku:

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

Jak to by było być dostosowane w celu uwzględnienia różnej liczby łańcuchów? na przykład CZEŚĆ, ŚWIAT i CZEŚĆ, TAM, MÓJ, ŚWIAT. Szukam tylko jednego wyrażenia do obsługi obu przykładów i z wbudowaną elastycznością dla nawet dłuższych macierzy – Chris

1

Wystarczy, aby zapewnić dodatkową przykład pkt 2 w odpowiedzi. Nie jestem pewien, jak ważne jest, aby uzyskać trzy grupy w jednym meczu, a nie trzy mecze z wykorzystaniem jednej grupy. Np. W 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 
Powiązane problemy