Как получить совпадения в iOS с помощью регулярного выражения? - PullRequest
25 голосов
/ 15 ноября 2010

Я получил строку типа 'stackoverflow.html' и в регулярном выражении 'stack (. ). Html' Я хотел бы иметь значение в (. ).

Я мог только найти NSPredicate, как:

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

Но это только говорит о том, что я получил совпадение и не возвращает строку, когда я использую NSRegularExpression:

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

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

Это даст мнеобщая строка назад, stackoverflow.html, но меня интересует только то, что в (. *).Я хочу вернуть «переполнение».В PHP это было легко сделать, но как вы можете сделать это в xCode для iOS?

Логически, если бы я сделал это:

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

Это дает мне правильный результат 'переполнение',Но проблема во многих случаях, я не знаю длину первой части или второй части.Так есть ли способ, которым я могу получить значение, которое должно быть в (. *)?

Или я должен решить выбрать самый уродливый метод, найдя местоположение (. ) и вычислить первое ивторая часть оттуда?Но в регулярном выражении у вас также может быть ([az]), но затем уродливый способ использовать другое регулярное выражение для получения местоположения значений между (), а затем использовать это для вычисления левой и правой части?И что произойдет, если у меня будет больше?как 'A (. ) должен найти ответ на (. *).'В качестве результата я хотел бы получить массив со значениями [0], значением после A и [1], значением после.

Надеюсь, мой вопрос понятен.

Заранее спасибо,

Ответы [ 2 ]

91 голосов
/ 06 июля 2011

в iOS 4.0+, вы можете использовать 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
1 голос
/ 15 ноября 2010

Вы хотите, чтобы библиотека RegexKitLite выполняла совпадения с регулярными выражениями:

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

После этого это почти так же, как вы делаете это в PHP.

Я добавлю немного кода, чтобы помочь вам с этим:

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

matchedString означает @ "переполнение", что должно быть именно тем, что вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...