2016-09-19 59 views
0

我負責將BB代碼轉換成WIKI表示法和thanx到許多例子,因此我已經破解了大多數更棘手的問題。這是我第一次進入正則表達式,我試圖去學習它(我寧願stringbuilder,但它似乎不適用於BB代碼)。我有4個項目我需要更換,我似乎無法創造適當的模式,以確定:(左原始的字符串,我需要在右雙破折號後)正則表達式模式BBCode到Wiki表示法,C#

enter image description here

的第一項是問題的孩子,因爲wiki引擎在空格處添加一個新行。它不是一個單獨的字段,而是一個更大的字符串的一部分,所以我不能TRIM()它。我目前使用

result = result.Replace("[b]", "*").Replace("[/b]", "*"); 

img的問題是需要的,如果有可能在給定的格式以某種方式包括的屬性。

爲最後2我難住。我已經使用

Regex r = new Regex(@"<a .*?href=['""](.+?)['""].*?>(.+?)</a>"); 
     foreach (var match in r.Matches(multistring).Cast<Match>().OrderByDescending(m => m.Index)) 
     { 
      string href = match.Groups[1].Value; 
      string txt = match.Groups[2].Value; 
      string wikilink = "[" + txt + "|" + href + "]"; 
      sb.Remove(match.Groups[2].Index, match.Groups[2].Length); 
      sb.Insert(match.Groups[2].Index, wikilink); 
     } 

在過去的HTML,但似乎無法重構它爲我目前的需求。建議,資源鏈接,所有將不勝感激。

編輯 解決了IMG的問題,雖然不漂亮,我仍然冒險刪除關閉[/ img]標籤可能不早抓。在[IMG]代碼是相當一致的,所以我用:

   Regex imgparser = new Regex(@"\[img[^\]]*\]([^\[]*)"); 
       foreach (var itag in imgparser.Matches(multistring).Cast<Match>().OrderByDescending(m => m.Index)) 
       { 
        string isrc = itag.Groups[1].Value; 
        string wikipic = itag.ToString().Replace("[img ", "!" + isrc).Replace("width=", "!width=").Replace("height=", ",height=").Replace("]" + isrc, string.Empty); 
        result = result.Replace(itag.ToString(), wikipic); 
       } 
       result = result.Replace("[/img]", "!"); 
+0

3)['\ [URL =(郵寄地址: [^]] *)]。*?\ [/ url]' - >'[$ 1]'](http://regexstorm.net/tester?p=%5c%5burl%3d(mailto%3a%5b%圖5e%5D%5D *)%5D。*%3F%5C%5B%2furl%5D與I =%5BB%5dRaynor +沙因++%5B%2FB %5D%0D 0A%%5bimg +寬度%3d130 +高度%3D30%5datt6387%5B%2fimg%5D%0D 0A%%5burl%3dmailto%3amc%23example.com%5dmc%40example.com%5B%2furl%5D %0D 0A%%5burl%3dhttp%3A%2F%2fwww.example.com%2F%5dmy +鏈路+文本%5B%2furl%5D&R =%5B%241%5D)。 4)'\ [url =(http [^]] *)](。*?)\ [/ url]' - >'[$ 2 | $ 1]'。 –

回答

1

我可以給你一個小例子對於最後一種情況:

string str1 = "[url=http://aadqsdqsd]link[/url]"; 
var pattern = @"^\[url=(.*)\](.*)\[\/url\]$"; 
var match = Regex.Match(str1, pattern); 
var result = string.Format("[{0}| {1}]", match.Groups[2].Value, match.Groups[1].Value); 
//[link| http://aadqsdqsd] 

難道你想要什麼?

編輯

,如果你想匹配一個較大的字符串,你可以這樣做:

var strTomatch = "[url=http://1]link1[/url][url=http://2]link2[/url]" + Environment.NewLine + 
        "[url = http://3]link3[/url]" + Environment.NewLine + 
        "[url=http://4]link4[/url]"; 

    var match = Regex.Match(strTomatch, @"\[url\s*=\s*(.*?)\](.*?)\[\/url\]", RegexOptions.Multiline); 
    while (match.Success) 
    { 
     var result = string.Format("[{0}| {1}]", match.Groups[2].Value, match.Groups[1].Value); 
     Debug.WriteLine(result); 
     match = match.NextMatch(); 
    } 

輸出

[link1| http://1] 
[link2| http://2] 
[link3| http://3] 
[link4| http://4] 
+0

感謝您的回覆。該模式絕對確實抓住了我想要的。有沒有辦法將通配符添加到正則表達式模式的開始和結束處?在這種情況下,str1是較大字符串的一部分,如果在字符串參數之前和/或之後有字符,則它不匹配任何內容。只是想了解,提前謝謝你 – Darkloki