2016-02-02 2 views
0

Я попытался выполнить поиск нескольких строк в строке textview. Я попытался найти буквы символов emoji через регулярное выражение. Я сделал,Как проверить несколько слов в строке ios?

NSMutableString *searchedString = [NSMutableString stringWithString:self.postTxtView.text]; 
NSError* error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(:D|:))" options:0 error:&error]; 
NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])]; 
for (NSTextCheckingResult* match in matches) 
{ 
    NSString* matchText = [searchedString substringWithRange:[match range]]; 
    NSLog(@"match: %@", matchText); 
} 

Но это не работает для @"(:D|:)). Он хорошо работает с @"(:D). Почему и как я могу проверить строки, такие как :D, :), :(, :* и т. Д.?

+0

может быть, '@" (: D | \\)) '... – holex

ответ

1

Вы можете заметить, что в Objective C специальный регулярных выражений метасимволы как ., ), (, [ , ], +, ?, \\, $, ^, *, { и } должны быть либо убежали с двойным обратные косые или поместить в символьный класс [...]:

NSMutableString *searchedString = [NSMutableString stringWithString:@":D and :)"]; 
NSError* error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern:@"(:D|:\\))" options:0 error:&error]; 
NSArray* matches = [regex matchesInString:searchedString options:0 range:NSMakeRange(0, [searchedString length])]; 
for (NSTextCheckingResult* match in matches) 
{ 
    NSString* matchText = [searchedString substringWithRange:[match range]]; 
    NSLog(@"match: %@", matchText); 
} 
return 0; 

Выход:

2016-02-02 01:47:03.723 prog[2261] match: :D 
2016-02-02 01:47:03.723 prog[2261] match: :) 

См demo

+0

Когда вы используете regex101.com, убедитесь, что вы выбрали синтаксис PCRE и избегаете символов, которые я перечислял. Затем в Objective-C вам нужно просто удвоить обратную косую черту. Другим способом написания вашего текущего регулярного выражения является '(: D |: [)])' (или даже использование не-захватывающих групп ['(? :: (?: D | [)]))'] (https: // regex101.com/r/aJ7oM9/1)). –

2

) - специальный символ, и вам нужно сбежать от него в шаблоне REGEX, используя обратную косую черту.

Правильно экранированный шаблон REGEX выглядит так: (:D|:\)). Однако в Objective-C недостаточно \), так как сам обратный слэш - это особый символ, который пропускает другие символы. Таким образом, строка шаблона должна быть «с двойным экранированием» с двумя зазорами: экранирование специального escape-символа.

Таким образом, в Objective-C, вы должны использовать этот шаблон: @"(:D|:\\))"

Вы можете проверить его здесь: https://regex101.com/r/jB1yL8/1

+0

его говорит «неизвестная escape-последовательность» \) '' – codebot

+2

Хороший ответ и классный сайт. Я не использую ReEx достаточно часто, чтобы быть свободным, так что сайт будет полезен в тех редких случаях, когда мне это нужно. Спасибо, что поделились ею. –

+0

@codebot Я обновил свой ответ. Произошло исчезновение для строки Objective-C –

Смежные вопросы