парсинг твита с регулярным выражением - PullRequest
1 голос
/ 13 декабря 2011

Regex-нуб здесь. Ищите некоторый код регулярного выражения C # для "выделения синтаксиса" текста в твиттере. Итак, учитывая этот твит:

@taglius here's some tweet text that shouldn't be highlighted #tagtestpix http://aurl.jpg

Я хочу найти упоминания пользователем (@), хэштеги (#) и URL-адреса (http://)) и добавить соответствующий HTML-код, чтобы выделить эти элементы цветом. Что-то вроде

<font color=red>@taglius</font> here's some tweet text that shouldn't be highlighted   <font  color=blue>#tagtestpix</font> <font color=yellow>http://aurl.jpg</font>

Это не тот HTML-код, который я буду использовать, но я думаю, вы поняли идею.

Ответы [ 3 ]

1 голос
/ 13 декабря 2011

Следующее будет соответствовать символу '@', за которым следует последовательность буквенно-цифровых символов:

@\w+

Следующее будет соответствовать символу «#», за которым следует последовательность буквенно-цифровых символов:

\#\w+

Существует множество выражений соответствия URL в произвольной форме, именно это я использую чаще всего:

https?://[-\w]+(\.\w[-\w]*)+(:\d+)?(/[^.!,?;""\'<>()\[\]\{\}\s\x7F-\xFF]*([.!,?]+[^.!,?;""\'<>\(\)\[\]\{\}\s\x7F-\xFF]+)*)?

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

the url http://Roger@example.com/#bookmark is interesting.

Очевидно, что это будет проблемой, поскольку все три выражения будут совпадать внутри URL. Чтобы избежать этого, вам необходимо выяснить, каким персонажам разрешено предшествовать или следовать за матчем. Например, для следующего требуется пробел или начало строки, предшествующие ссылке @name, и знак ',' или пробел после нее.

(?<=[^\s])@\w+(?=[,\s])

Шаблоны регулярных выражений не легки, я рекомендую приобрести такой инструмент, как Expresso .

1 голос
/ 14 декабря 2011

Ответы выше являются частями всего ответа, поэтому я думаю, что могу добавить немного больше, чтобы ответить на ваш вопрос:

Ваша функция выделения будет выглядеть примерно так:

public static String HighlightTwitter(String input)
{
    String result = Regex.Replace(input, @"\b\@\w+", @"<font color=""red"">$0</font>");
    result = Regex.Replace(result, @"\b#\w+", @"<font color=""blue"">$0</font");
    result = Regex.Replace(result, @"\bhttps?://[-\w]+(\.\w[-\w]*)+(:\d+)?(/[^.!,?;""\'<>()\[\]\{\}\s\x7F-\xFF]*([.!,?]+[^.!,?;""\'<>\(\)\[\]\{\}\s\x7F-\xFF]+)*)?\b", @"<font color=""yellow"">$0</font", RegexOptions.IgnoreCase);
    return result;
}

Я включил \ b, чтобы убедиться, что @ и # - это начало слова, и чтобы URL-адреса стояли отдельно.Это означает, что #this_will_highlight, но # this_will_not.

Если производительность может быть проблемой, вы можете сделать Regex'ы статическими членами с помощью RegexOptions.Compiled

Например:

private static Regex regexAt = new Regex(@"\b\@\w+", RegexOptions.Compiled);
...
    String result = regexAt.Replace(input, @"<font color=""red"">$0</font>");
    ...
0 голосов
/ 13 декабря 2011

Вы можете анализировать @ ответы, используя (\ @ \ w +). Вы можете разобрать хеш-теги используя (# \ w +).

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