2016-06-08 17 views
0

мне нужно найти имена пользователей (например, твиттер из них) в строках, например, если строка:Регулярного выражения для резьбовых имен пользователей из строки

"Hello, @username! How are you? And @username2??" 

Я хочу, чтобы изолировать/извлечь @username и @username2

вы знаете, как сделать это в Objective-C Do, я нашел это для Python regex for Twitter username, но не работает для меня

Я попытался это так, но не работает:

NSString *comment = @"Hello, @username! How are you? And @username2??"; 

NSError *error = nil; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=^|(?<=[^a-zA-Z0-9-\\.]))@([A-Za-z]+[A-Za-z0-9-]+)" options:0 error:&error]; 
NSArray *matches = [regex matchesInString:comment options:0 range:NSMakeRange(0, comment.length)]; 
for (NSTextCheckingResult *match in matches) { 
    NSRange wordRange = [match rangeAtIndex:1]; 
    NSString *username = [comment substringWithRange:wordRange]; 
    NSLog(@"searchUsersInComment result --> %@", username); 
} 
+0

пожалуйста, не создавать новые вопросы. Это приведет к дублированию вопросов. Измените свой старый вопрос, добавив детали того, что сработало, а что нет. Тогда люди смогут снова открыть ваш вопрос. –

+0

Да, но мой старый вопрос был отмечен как DUPLICATE и закрыт, мне пришлось открыть новый – Quetool

+0

, что не сработало для вас? –

ответ

1

(?<=^|(?<=[^a-zA-Z0-9-\\.]))@([A-Za-z]+[A-Za-z0-9-]+) является пренебрегая письма и захватить только имена пользователей, так как ваша строка не содержит какие-либо сообщений электронной почты, вы должны просто использовать @([A-Za-z]+[A-Za-z0-9-]+)

Вашего регулярного выражения неправильно. Вам нужно изменить его:

NSString *comment = @"Hello, @username! How are you? And @username2??"; 

    NSError *error = nil; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"@([A-Za-z]+[A-Za-z0-9-]+)" options:0 error:&error]; 
    NSArray *matches = [regex matchesInString:comment options:0 range:NSMakeRange(0, comment.length)]; 
    for (NSTextCheckingResult *match in matches) { 
     NSRange wordRange = [match rangeAtIndex:1]; 
     NSString *username = [comment substringWithRange:wordRange]; 
     NSLog(@"searchUsersInComment result --> %@", username); 
    } 

FYI: Любой подшаблонов внутри пары скобок будут захвачены в качестве группы. На практике это можно использовать для извлечения информации, например, телефонных номеров или электронных писем из всех видов данных. Представьте, например, что у вас есть инструмент командной строки, чтобы отобразить все файлы изображений, которые у вас есть в облаке. Затем вы можете использовать шаблон, например^(IMG \ d + .png) $, для захвата и извлечения полного имени файла, но если вы хотите только сохранить имя файла без расширения, вы можете использовать шаблон^(IMG \ d +). png $, который только фиксирует часть до периода.

Я хотел бы предложить вам прочитать о регулярных выражениях строк: http://regexone.com/lesson/capturing_groups

+0

ДА, это абсолютно правильно! благодаря! – Quetool

+1

Кроме того, '(? <=^| (? <= [^ A-zA-Z0-9 - \\.]))' Чрезмерно творческий. '(?