2010-10-14 32 views
2

我解析一個BB代碼圖像標籤:C#Regex.Replace():獲取值

[IMG] http://imagesource.com [/ IMG]

我使用下面的Replace()函數:

Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase); 

而我需要在解析時獲取URL。我需要知道「$ 1」的價值。可能嗎? Regex類以某種方式用我需要的值替換「$ 1」字符串,所以必須有一種方法來獲取它。

+0

使用正則表達式解析bbcode與使用正則表達式解析HTML具有相同的缺點,因爲它們都不是常規語言。請參閱http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454你應該看看使用bbcode解析器(快速谷歌搜索發現http: //bbcode.codeplex.com/例如) – 2010-10-14 15:48:14

回答

6

這聽起來像你正在尋找Replace方法與接受MatchEvaluator的重載。該方法的MSDN頁面可以找到here

試試這個:

string input = "[img]http://imagesource.com[/img]"; 
string pattern = @"\[img]([^\]]+)\[\/img]"; 
string result = Regex.Replace(input, pattern, m => 
    { 
     var url = m.Groups[1].Value; 
     // do something with url here 
     // return the replace value 
     return @"<img src=""" + url + @""" border=""0"" />"; 
    }, 
    RegexOptions.IgnoreCase); 

它使用多語句lambda來簡化與組的工作並返回替換值之前進行更多的邏輯。你可以,當然,擺脫這個代替:

string result = Regex.Replace(input, pattern, 
    m => @"<img src=""" + m.Groups[1].Value + @""" border=""0"" />", 
    RegexOptions.IgnoreCase); 

在上述情況下,沒有必要爲return,但它只是返回原始的字符串而無需額外的評估。你可以粘貼一些三元運算符並添加邏輯,但看起來很亂。多語句lambda更清晰。您可以考慮以自己的方法將其分解出來,如前面提到的MSDN鏈接所示,如果它太大或將在其他Regex.Replace工作中重複使用。

順便說一下,我還通過刪除]的轉義,稍微簡化了你的模式。只有開頭[需要轉義。

+0

令人驚歎!這正是我需要的。謝謝! – Alex 2010-10-14 16:07:50

+1

它看起來像第一組包含整個字符串,這就是爲什麼他使用m.Groups [1] – reggaeguitar 2014-03-27 20:12:01

+0

@reggaeguitar這是正確的。索引0處的組包含整個匹配。 – 2014-03-27 20:18:57

0

要保留捕獲的字符串,只需「捕獲」返回值。

string s = Regex.Replace(msg, @"\[img\]([^\]]+)\[\/img\]", @"<img src=""$1"" border=""0"" />", RegexOptions.IgnoreCase); 
+0

但是這返回整個事情... – Alex 2010-10-14 15:58:55

0

捕獲組可用於正則表達式匹配的捕獲屬性,如果您執行匹配而不是替換,那麼您將有權訪問該組。

+0

我試過使用「r.Match(文本).Groups [0]」但它沒有工作 – Alex 2010-10-14 15:58:23

+0

對不起,我列出了屬性。捕獲屬性具有所有捕獲組,組是所命名的捕獲組。如果沒有任何命名的,則組[0]是最後匹配的捕獲。 – 2010-10-14 16:44:35