正则表达式匹配太多

时间:2009-09-03 15:01:35

标签: c# regex

(\[(c|C)=)(#?([a-fA-F0-9]{1,2}){3})\](.*)\[/(c|C)\]

我希望此表达式匹配以下文本:“这是[c = FFFFFF]白色文本[/ c]和[C =#000]黑色文本[/ C]。”

它仅匹配一个BB代码,但如果彼此之后有更多(例如,在示例中),它将创建两个BB代码序列的匹配(1匹配)。 (从[c = FFFFFF] wh ...到... ck text [/ C])

为什么会这样?另外,如何使点(。)在C#中包含换行符?

5 个答案:

答案 0 :(得分:3)

如果您不关心嵌套标签,可以这样做:

(\[[cC]=)(#?([a-fA-F0-9]{3}){1,2})\](.*?)\[/[cC]\]
//                                     ^- lazy match

如果要使用正则表达式处理嵌套标记,请在代码项目上检查this article

答案 1 :(得分:2)

如果您设置选项RegexOptions.Singlelinemore on that here),则点匹配换行符。

答案 2 :(得分:1)

这是因为RE是greedy;它将始终尝试产生最大可能的匹配。

应该可以让您的RE引擎不贪婪,请参阅链接文档以获取有关尝试内容的提示。

答案 3 :(得分:0)

你需要一个懒惰的正则表达式来取不到所有[c]标签

试试这个

\[c=(#?.*?)\](.*?)\[/c\] or
\[c=(#?\w*?)\](\w*?)\[/c\]

您应该将regex对象上的选项设置为ingnore case。

答案 4 :(得分:0)

正则表达式是一种快速的方法,这里的解决方案是使用.*?而不仅仅是.*。但是,如果你想要一个更强大的解决方案,没有正则表达式可能更容易。在C#中你碰巧来做嵌套结构,但这并不意味着它实际上很容易。最好使用词法解析器并构造DOM。很可能代码更容易阅读和维护。