【发布时间】:2011-08-10 21:52:41
【问题描述】:
我有一个抓取 BBcode 标签的正则表达式。它工作得很好,除了一个小故障。
这是当前的表达式:
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]
这是它成功匹配的一些文本以及它构建的组:
[url=http://www.google.com]Go 到谷歌![/url]
1:网址
2:http://www.google.com
3:去谷歌![img]http://www.somesite.com/someimage.jpg[/img]
1:图片
2:空
3:http://www.somesite.com/someimage.jpg[quote][quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote][/quote]
1:报价
2:空
3:[quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote]
这一切都很棒。我可以通过对同一个正则表达式运行第三个匹配组来处理嵌套标签,并递归处理所有嵌套标签。问题在于使用 [quote] 标签的示例。请注意,第三个匹配组是一组两个引号标签,因此我们期望两个匹配项。但是,我们得到一个匹配,如下所示:
[quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote]
1:报价
2:空
3:第一个嵌套引用[/quote][quote]第二个嵌套引用
啊啊啊!这根本不是我们想要的。有一个相当简单的方法来修复它,我从这个修改正则表达式:
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](.+)\[/\1\]
到这里:
\[([^=\[\]]+)[=\x22']*([^ \[\]]*)['\x22]*\](((?!\[/\1\]).)+)\[/\1\]
通过添加((?!\[/\1\]).),如果第三个匹配组包含结束 BBcode 标记,我们会使整个匹配无效。所以现在这行得通,我们得到了两个匹配项:
[quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote]
[quote]第一个嵌套引用[/quote]
1:报价
2:空
3:第一个嵌套引用[quote]第二个嵌套引用[/quote]
1:报价
2:空 3:第二个嵌套引用
我很高兴修复了它,但现在我们遇到了另一个问题。这个新的正则表达式在我们将两个引号标签嵌套在一个更大的引号标签下的第一个上失败了。我们得到两个匹配而不是一个:
[quote][quote]第一个嵌套引用[/quote][quote]第二个嵌套引用[/quote][/quote]
[quote][quote]第一个嵌套引用[/quote]
1:报价
2:空
3: [quote]第一个嵌套引用[quote]第二个嵌套引用[/quote]
1:报价
2:空
3:第二个嵌套引用
第一个匹配完全错误,第二个匹配虽然格式良好,但不是理想的匹配。我们想要一个大匹配,第三个匹配组是两个嵌套的引号标签,就像我们使用第一个表达式时一样。
有什么建议吗?如果我能跨越这个差距,我应该有一个相当强大的 BBcode 表达式。
【问题讨论】:
标签: c# .net regex regex-negation recursive-regex