2013-02-16 3 views
8

Struny są badane wyglądać następująco (zauważyć spacje w nawiasach):W jaki sposób można usunąć białe znaki z grupy przechwytującej Regex?

[name] [address ] [ zip] [ phone number ] 

Wyrażenie Jestem obecnie za pomocą ...

\[([^\])]*)\] 

... skutecznie wychwytuje każdy tekst w obrębie wsporniki, ale również chwyta przednią i tylną przestrzeń więc skończyć z:

"name" "address " " zip" " phone number " 

Ale co szukam jest:

"name" "address" "zip" "phone number" 

Jak można się przekonać regex nie uchwycić spacje w tych przykładach? (Z wyjątkiem wbudowanego spacji - na przykład, że pomiędzy słowa „numer telefonu”).

(Uwaga: wiem, może po prostu przyciąć go od złapanych zmienna po wyrażenie jest zrobione, ale I” Próbuję to zrobić w kontekście kontekstem wyrażenia.)

Dzięki za wszelkie pomysły! Poniżej znajduje się dokładny kod, którego używam do przetestowania tego:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\[([^\\])]*)\\]" options:0 error:nil]; 

NSString *string = @" [name] [address ] [ zip] [ phone number ] "; 

NSString *modifiedString = [regex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) 
    withTemplate:@"\n\n[$1]"]; //note: adding brackets back here just to make it easy to see if the space has been trimmed properly from the captured value 

NSLog(@"\n\n%@", modifiedString); 

Odpowiedz

2

Mam zamiar przejść przez ten krok po kroku.

Po pierwsze, ([^\])]*) jest niepoprawny. Oznacza to "sekwencję 0 lub więcej znaków, o ile to możliwe, niezawierającą] lub)."

Na przykład, do tej wypowiedzi:

[name] [address) ] [ zip] [ phone number ] 

... część adresu będą pomijane, jako „adres)” nie pasuje [^\)]]* (co oznacza „sekwencję zero lub więcej znaków, nie wliczając) i]. "

Zamiast tego chcemy uzyskać ([^\]]*), który nie zostanie pominięty).

Następnie chcemy zjeść wszystkie przestrzenie wokół przechwytywania. W tym celu używamy dwóch  * sekwencje, po jednej z każdej strony wychwytywanie:

\[ *([^\]]*) *\]

Teraz musimy się trudne! Model [^\]]* jest domyślnie chciwy. Oznacza to, że niektóre przestrzenie po obu stronach mogą być dopasowane przez niego, a zatem włączone do przechwytywania! Zamiast tego chcemy użyć wersji nieagresywnej, [^\]]*?. Oznacza to "sekwencję 0 lub więcej znaków, niezawierającą), możliwie jak najkrótszą, zgodną z resztą wyrażenia regularnego".

\[ *([^\]]*?) *\]

+0

To niby zabawny pytanie do mnie, jak pisałem regex i Objective-C od lat, ale nigdy nie łączy się je za pomocą 'NSRegularExpression' wcześniej. :) –

+1

Dziękuję, to jest idealne! Jeśli jesteś nowym NSRegularExpression sprawdzić swoją „enumerateMatchesInString: opcje: Zakres: usingBlock:” metodę jakiegoś blokowe dobroci: http://blog.kvnd.me/post/10186864667/regular-expressions-in-ios –

+0

Czy pierwszy prawy nawias ")" obcy? Wygląda na to, że działa bez niego. –

3
@"\\[\\s*([^\\]]+?)\\s*\\]" 

lub

@"\\[ *([^\\]]+?) *\\]" 

Należy uważać, aby wejść do pomieszczenia wyżej.

To nie przechwyci spacjami: "?" NSLog wyjście
[nazwa]
[adres]
[zip]
[numer telefonu]

The sprawia, że ​​poprzednia meta nie jest chciwa, a chciwa jest domyślna.

Powiązane problemy