(\[(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#中包含换行符?
答案 0 :(得分:3)
如果您不关心嵌套标签,可以这样做:
(\[[cC]=)(#?([a-fA-F0-9]{3}){1,2})\](.*?)\[/[cC]\]
// ^- lazy match
如果要使用正则表达式处理嵌套标记,请在代码项目上检查this article。
答案 1 :(得分:2)
如果您设置选项RegexOptions.Singleline
(more 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。很可能代码更容易阅读和维护。