2011-12-13 15 views
1

正則表達式在這裏。尋找一些C#正則表達式代碼來「語法高亮」Twitter文本。因此,考慮這個鳴叫:用正則表達式分析tweet文本

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

我想找到的用戶提到(@),主題標籤(#)和網址(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

注意使Regex'es靜態成員。我已經接受並接受了我的舊問題的答案。感謝您的幫助。 – taglius 2011-12-13 19:49:04

+0

謝謝,先生。社區受益於你的慷慨=) – jadarnel27 2011-12-13 19:52:04

回答

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]) 

正則表達式模式是不容易的,我建議得到像Expresso的工具。上述

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

我有包括\ b以確保@和#是單詞的開頭,並確保URL是獨立的。這意味着#this_will_highlight而#this_will_not。

如果性能可能是一個問題,你可以用RegexOptions.Compiled

例如爲:

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