2016-01-28 3 views
0

Мне нелегко заставить мое регулярное выражение работать. Я пишу приложение, которое делает тегирование в разделе комментариев, поэтому каждый раз, когда есть символ @, мне нужно посмотреть следующий текст, чтобы сделать ссылку из него. То есть что делают Instagram и Twitter.iOS regex сопоставление не-пробельных символов до первого символа без слова после символа @

Ниже мое регулярное выражение, мне нужно получить все записи регулярного выражения, которое соответствует этим критериям: @, за которым следует любой буквенно-цифровой символ, и заканчивается, когда он попадает в пробел или другой символ @.

NSString *searchedString = cellComment.commentText; 
NSRange searchedRange = NSMakeRange(0, [searchedString length]); 
NSString *pattern = @"@.+[^\s]"; 
NSError *error = nil; 

NSRegularExpression* regex = [NSRegularExpression regularExpressionWithPattern: pattern options:0 error:&error]; 
NSArray* matches = [regex matchesInString:searchedString options:0 range: searchedRange]; 
for (NSTextCheckingResult* match in matches) { 
     NSString* matchText = [searchedString substringWithRange:[match range]]; 
     for(int i = 0; i< match.numberOfRanges;i++) 
     { 
      NSRange group1 = [match rangeAtIndex:i]; 
      NSLog(@"group1: %@%lu", [searchedString substringWithRange:group1],group1.location); 
     } 

} 
+0

Try '@ "@ \\ S +"'. Или '@" @ \\ S + \\ b "'. Для Twitter, '@ \\ w +' должен делать. –

+0

Вам следует откат к версии сообщения, где вы показывали свое регулярное выражение. –

+0

Я откатился к первой версии, потому что в противном случае это звучит как дубликат [* Regex, чтобы найти слова, начинающиеся с определенного символа *) (http://stackoverflow.com/questions/2678666/regex-to-find- слова-что-старт-с конкретным-символом). Проблема заключается не в том, что OP не знает шаблон для '@' + что-то, кроме использования сокращенных классов символов и способ сопоставления небелых символов до первого символа, отличного от слова. –

ответ

1

Вы были [^\s] в вашей первоначальной версии почтовой и проблема в том, что обратная косая черта должна быть удвоена в шаблонах регулярных выражений Objective-C. Кроме того, .+ соответствует одному или нескольким символам, кроме новой строки, что вам не нужно.

Вы можете использовать

NSString *pattern = @"\\[email protected]\\w\\S*\\b"; 

См regex demo, он соответствует

  • \B - граница не-слово (не должно быть ни слова символ перед @, удалить, если вам нужно, чтобы соответствовать в таких контексты)
  • @ - буква @
  • \w - буквенно-цифровой символ (используйте \p{L}, если первая должна быть буквой, или [\p{L}\d], если вы хотите разрешить букву или цифру в исходной позиции)
  • \S* - ноль или более символов без пробелов до ...
  • \b - граница слова.

Обратите внимание, что имена пользователей Twitter следовать этой схеме:

NSString *pattern = @"@\\w+"; 

В \w+ матчи любые буквенно-цифровые символы (один или несколько случаев).

Смотрите IDEONE demo of your code

+0

Вы спасатель. использовал последний, и он работает как шарм! –

+0

На всякий случай вам нужно убедиться, что символ '@ ...' появляется * после символа * * без слова * (т.е. как целое слово), вы можете использовать' @ "\\ B @ \\ S + \\ б "'. –