正则表达式模式 BBCode 到维基符号,C#
Regex pattern BBCode to Wiki Notation, C#
我的任务是将 BB 代码转换为 WIKI 符号,感谢 SO 上的许多示例,我已经破解了大部分难点。这是我第一次涉足正则表达式,我正在努力学习它(我更喜欢 stringbuilder,但它似乎不适用于 BB 代码)。我有 4 件物品需要更换,但我似乎无法创建正确的模式来识别:( 左边是原始字符串,双破折号后右边是我需要的东西 )
第一项是问题子项,因为 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]", "!");
最后一个案例我可以给你举个小例子:
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]
我的任务是将 BB 代码转换为 WIKI 符号,感谢 SO 上的许多示例,我已经破解了大部分难点。这是我第一次涉足正则表达式,我正在努力学习它(我更喜欢 stringbuilder,但它似乎不适用于 BB 代码)。我有 4 件物品需要更换,但我似乎无法创建正确的模式来识别:( 左边是原始字符串,双破折号后右边是我需要的东西 )
第一项是问题子项,因为 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]", "!");
最后一个案例我可以给你举个小例子:
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]