【问题标题】:Regex pattern BBCode to Wiki Notation, C#正则表达式模式 BBCode 到 Wiki Notation,C#
【发布时间】:2016-09-19 17:01:36
【问题描述】:

我的任务是将 BB 代码转换为 WIKI 符号,然后将其转换为 SO 上的许多示例,因此我已经破解了大多数棘手的问题。这是我第一次尝试 Regex,我正在尝试学习它(我更喜欢 stringbuilder,但它似乎不适用于 BB 代码)。我有 4 个需要更换的项目,但我似乎无法创建正确的模式来识别:(左边是原始字符串,在双破折号后右边是我需要的

第一项是问题子项,因为 wiki 引擎在空格所在的位置添加了一个新行。它不是一个单独的字段,而是一个较大字符串的一部分,所以我不能 TRIM() 它。我目前正在使用

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

img 问题是需要以某种方式在给定格式中包含属性(如果可能)。

对于最后两个我很难过。我用过

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]", "!");

【问题讨论】:

标签: c# regex wiki bbcode


【解决方案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]

【讨论】:

  • 感谢您的回复。这种模式确实能捕捉到我想要的东西。有没有办法在正则表达式模式的开头和结尾添加一个通配符?在这种情况下,str1 是较大字符串的一部分,如果字符串参数之前和/或之后有字符,它不会匹配任何内容。只是想了解一下,先谢谢了
猜你喜欢
  • 2013-07-04
  • 1970-01-01
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
  • 2012-05-21
  • 2011-03-17
  • 1970-01-01
相关资源
最近更新 更多