我正在使用正则表达式检测帖子中的论坛标签,例如“[quote] text [/ quote]”,然后用HTML格式替换它们。我发布了一个关于嵌套代码问题的问题Forum tags. What is the best way to implement them?。
我有一个想法,但我需要别人的帮助来帮助我扩展它(因为我吮吸正则表达式)。
我需要修改此正则表达式
string regex = @"\[([^=]+)[=\x22']*(\S*?)['\x22]*\](.+?)\[/(\1)\]";
现在,它匹配一个开始和结束标记,包含标记名称的匹配组,标记内容以及可选值,例如此论坛标记[url=www.google.com]click me[/url]
中等于等于的值。
我需要的是表达式匹配开始标记或结束标记,并且有一个包含标记名称的匹配组(包括结束标记的'/')。然后我想要迭代它们,就像这样:
Dictionary<string, int> tagCollection = new Dictionary<string, int>();
inputString = Regex.Replace(inputString, @"expression I'm asking for here",
match =>
{
string tag = match.Groups[0].Value;
bool isOpeningTag = tag.StartsWith("/");
tag = isOpeningTag ? tag : tag.Replace("/","");
int tagCount = 0;
if (tagCollection.ContainsKey(tag) && isOpeningTag)
{
tagCount = tagCollection[tag];
tagCollection[tag] = tagCount + 1;
}
else if (tagCollection.ContainsKey(tag) && !isOpeningTag)
{
tagCount = tagCollection[tag];
tagCollection[tag] = tagCount - 1;
}
else if (!tagCollection.ContainsKey(tag) && isOpeningTag)
tagCollection.Add(tag, tagCount);
string newTag = match.Value.Replace(tag, tag + tagCount.ToString());
return newTag;
});
现在,每个标记都附加一个数字,我可以使用原始正则表达式来执行标记函数,并将嵌套标记正确地作为单独的标记处理。实际上,我需要的是我列出的正则表达式,以我指定的方式进行修改。
随意提供其他建议,但我会问实际答案是关注正则表达式修改,而不是这是否是解决问题的最佳方法。
谢谢!
答案 0 :(得分:1)
这可能会对你有所帮助,这是我写的一段时间的bbcode解析器,基本上就是你正在做的事情。
https://github.com/Mike343/Netcoders/tree/master/Coders.Services/Formatters
https://github.com/Mike343/Netcoders/blob/master/Coders.Services/Formatters/BBCodeFormatter.cs
答案 1 :(得分:0)
\[([^=]+)[=\x22']*(\S*?)['\x22]*\]|\[/(\1)\]