嵌套BBTag的正则表达式

时间:2014-01-11 15:58:12

标签: c# regex

我找到/制作了一个正则表达式解析bbtags很好但它有一个缺陷,它不会处理与包含标记相同的嵌套标记。

我制作的BBTag解析器依赖于这样的事实,即最外面的标签可以包含子标签,如果嵌套标签与包含标签不同,那么这些子标签可以正常工作

我使用的正则表达式是:@"\[color=((.|\n)*?)(?:\s*)\]((.|\n)*?)\[/color(?:\s*)\]"

测试应用程序(简单的控制台应用程序)

var regex = new Regex(@"\[color=((.|\n)*?)(?:\s*)\]((.|\n)*?)\[/color(?:\s*)\]");

var matches = regex.Matches("[color=red]This is red.[color=green] This be green.[/color] Still red here.[/color] This has no color [color=green] and this is green.[/color]").Cast<Match>().Where(x => x.Success).ToList();
if (matches.Count > 0)
    for(int m = 0; m < matches.Count; m++)
        for (int i = 0; i < matches[m].Groups.Count; i++)
            Console.WriteLine("({0}) - {1} -> {2}", m, i, matches[m].Groups[i]);
else
    Console.WriteLine("No matches.");

2 个答案:

答案 0 :(得分:1)

只需使用BBCode库。 Codekicker.BBCode解析BBCode,将其转换为HTML或文本,并为您提供可转换的AST。

正则表达式不适用于分层解析。你将很难完成这项工作。臭虫很难找到。安全问题将会出现。

答案 1 :(得分:0)

如果你想用regex匹配这种东西(可以嵌套),你可以使用平衡组技术:

(?:[^][]|(?<Open>\[([a-z]+)[^]]*])|(?<Content-Open>\[/\1]))+(?(Open)(?!))

您可以找到有关此技术here的有趣信息。