NSRegularExpression: как сопоставить слово, начинающееся с @

#iphone #objective-c

#iPhone #objective-c

Вопрос:

Я хотел бы преобразовать ссылки на имена пользователей, такие как @me, @you, @them (стиль Twitter), в ссылки. Какой шаблон NSRegularExpression был бы правильным для этого?


Основываясь на вводе из ответов ниже, вот что я в итоге использовал…

 NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<!\w)@([\w\._-] )?" options:NSRegularExpressionCaseInsensitive error:amp;error];
NSString *newString = [regex stringByReplacingMatchesInString:stringIn options:0 range:NSMakeRange(0, [stringIn length]) withTemplate:@"<a href='http://mydomain.com/$1'>$0</a>"];
  

Возможно, это не совсем подходит для Twitter, поскольку мой собственный сайт поддерживает точки, тире и подчеркивания

Комментарии:

1. Работает хорошо. Как указывает E-madd в своей правке, если вы используете это для Twitter, вы хотите запретить точки и дефисы, поэтому шаблон «(? <!\w)@([\w _] )?». В именах пользователей Twitter разрешены подчеркивания.

Ответ №1:

(?<!w)@w должно быть довольно безопасно.

(?<!w) Это называется отрицательным взглядом назад и гарантирует, что перед @ нет символа слова, что препятствует сопоставлению адресов электронной почты.

Ответ №2:

@[a-zA-Z0-9_] работа должна быть выполнена довольно хорошо.

Я бы рекомендовал добавить некоторые тестовые данные в RegExr и поработать с регулярным выражением, чтобы оно соответствовало именно тому, что вам нужно.

Комментарии:

1. Амперсанд не обязательно экранировать. Названия Twitter также могут содержать подчеркивания.

2. Кроме того, звездочка означает ноль или более случаев, так что это будет соответствовать @ само по себе.

3. @dreamlax Хороший улов. Моя ошибка. @Nikolai Я надеюсь, что любой, кто хочет использовать регулярные выражения, по крайней мере, понимает их достаточно, чтобы вносить в них незначительные изменения. В любом случае, ответ обновлен, чтобы отразить обе критики.