使用正则表达式解析推文文本

时间:2011-12-13 19:34:56

标签: c# regex twitter

Regex-noob在这里。寻找一些C#正则表达式代码来“语法高亮”推文文本。所以给这条推文:

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

我想找到用户提及(@),hashtags(#)和urls(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 个答案:

答案 0 :(得分:1)

以下内容匹配'@'字符后跟一系列alpha-num字符:

@\w+

以下内容将匹配'#'字符,后跟一系列alpha-num字符:

\#\w+

有很多自由形式的http 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 :(得分: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;
}

我已经包含\ b以确保@和#是单词的开头,并确保网址独立。这意味着#this_will_highlight但#this_will_not。

如果性能可能成为问题,您可以使用RegexOptions.Compiled将正则表达式作为静态成员

E.g:

private static Regex regexAt = new Regex(@"\b\@\w+", RegexOptions.Compiled);
...
    String result = regexAt.Replace(input, @"<font color=""red"">$0</font>");
    ...

答案 2 :(得分:0)

您可以使用(\ @ \ w +)解析@回复。您可以使用(#\ w +)解析哈希标记。