2011-12-13 2 views
1

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

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

Я хочу найти пользователь упоминает (@), Hashtags (#), и веб-сайты (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, который я буду использовать, но я думаю, что вы поняли идею.

+0

отметил. Я прошел и принял ответы на мои старые вопросы. Спасибо за помощь. – taglius

+0

Спасибо, сэр. Сообщество пользуется вашей щедростью =) – jadarnel27

ответ

1

Следующая будет соответствовать «@», за последовательностью альфа-Num символов:

@\w+ 

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

\#\w+ 

Там много свободных форм выражения соответствия HTTP URL, это один я использую наиболее часто:

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

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

the url http://[email protected]/#bookmark is interesting. 

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

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

Regex модели не так просто, я рекомендую получить инструмент, как Expresso.

+0

оба комментария приводят меня в правильном направлении, я выбрал этот, поскольку он был более полным. – taglius

0

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

1

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

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

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; 
} 

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

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

т.д .:

private static Regex regexAt = new Regex(@"\b\@\w+", RegexOptions.Compiled); 
... 
    String result = regexAt.Replace(input, @"<font color=""red"">$0</font>"); 
    ... 
Смежные вопросы