2010-11-15 16 views
25

Mam ciąg taki jak "stackoverflow.html" i wyrażenie regularne "stos (.) .html" Chciałbym mieć wartość w (.).Jak uzyskać dopasowania w iOS przy użyciu wyrażenia regularnego?

mogłem tylko znaleźć NSPredicate jak:

NSString *string  = @"stackoverflow.html"; 
NSString *expression = @"stack(.*).html"; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", expression]; 
BOOL match = [predicate evaluateWithObject:string] 

Ale to tylko mówi mam mecz i nie zwraca ciąg, gdy używam NSRegularExpression:

NSRange range = [string rangeOfString:expression options:NSRegularExpressionSearch|NSCaseInsensitiveSearch]; 
if (range.location == NSNotFound) return nil; 

NSLog (@"%@", [string substringWithRange:(NSRange){range.location, range.length}]); 

To daje mi całkowity ciąg z powrotem, stackoverflow.html, ale interesuje mnie tylko to, co jest w (. *). Chcę odzyskać "przepełnienie". W PHP było to łatwe do zrobienia, ale jak można to osiągnąć w XCode dla iOS?

Logicznie czy chciałbym to zrobić:

NSInteger firstPartLength = 5; 
NSInteger secondPartLength = 5; 
NSLog (@"%@", [string substringWithRange:(NSRange){range.location + firstPartLength, range.length - (firstPartLength + secondPartLength)}] 

To daje mi wynik propert 'przepełnienia'. Ale problem jest w wielu przypadkach nie wiem długość pierwszej części lub drugiej części. Czy istnieje sposób, aby uzyskać wartość, która powinna być (. *)?

Czy muszę zdecydować się wybrać najbrzydszą metodę, znajdując lokalizację (.) i obliczyć pierwszą i drugą część stamtąd? Ale w wyrażeniu regularnym możesz również mieć ([a-z]), ale potem brzydki sposób użycia innego wyrażenia regularnego, aby uzyskać położenie wartości pomiędzy(), a następnie użyć go do obliczenia lewej i prawej części? A co się stanie, jeśli będę miał więcej? jak "A (.) powinien znaleźć odpowiedź na (. *)." Chciałbym mieć tablicę jako wynik wartości [0] wartość po A i [1] wartość po do.

Mam nadzieję, że moje pytanie jest jasne.

Dzięki z góry,

Odpowiedz

1

Chcesz bibliotekę RegexKitLite w celu wykonania wyrażenie regularne mecze:

http://regexkit.sourceforge.net/RegexKitLite/

Po że to prawie dokładnie tak, jak to zrobić w PHP.

dodam jakiś kod, aby pomóc w tym:

NSString *string  = @"stackoverflow.html"; 
NSString *expression = @"stack(.*)\\.html"; 
NSString *matchedString = [string stringByMatching:expression capture:1]; 

matchedString jest przepełnienie "@", który powinien być dokładnie to, czego potrzebują.

+3

myślę NSRegularExpression bardziej przydatny – SAKrisT

+0

porównaniu do Perl czy Ruby lub wielu innych językach, NSRegularExpression jest mocny, ale w najczęstszych przypadkach stosuje paragraf zrobić praca warta zdania. Podoba mi się, jak ten przykład biblioteki pozwala dopasować wyrażenie i przechwycić grupę w jednej rozsądnej linii. –

91

w iOS 4.0+ można używać NSRegularExpression:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"stack(.*).html" options:0 error:NULL]; 
NSString *str = @"stackoverflow.html"; 
NSTextCheckingResult *match = [regex firstMatchInString:str options:0 range:NSMakeRange(0, [str length])]; 
// [match rangeAtIndex:1] gives the range of the group in parentheses 
// [str substringWithRange:[match rangeAtIndex:1]] gives the first captured group in this example 
Powiązane problemy