【问题标题】:String delimited regular expression字符串分隔的正则表达式
【发布时间】:2009-02-20 00:23:44
【问题描述】:

我正在尝试构建一个 bbcode 解析器,但我在弄清楚如何避免匹配过于广泛时遇到了很多问题。例如,我想实现一个 [list] 到这样的转换:

\[list\](.*)\[/list\]

将被替换为:

<ul>$1</ul>

这很好用,除非我有两个列表,其中正则表达式匹配第一个列表的开始标记和第二个列表的结束标记。所以这个

[list]list1[/list] [list]list2[/list]

变成这样:

<ul>list1[/list] [list]list2</ul>

这会产生非常丑陋的输出。关于如何解决这个问题的任何想法?

【问题讨论】:

  • 比这个正则表达式伪解析器更好地构建一个真正的解析器。至少当您需要嵌套列表时,您会发现正则表达式并不是所有问题的答案。

标签: java regex parsing bbcode


【解决方案1】:

您使用的方法可能最终不是一个特别好的方法,但要解决该特定问题,只需更改为非贪婪匹配:

\[list\](.*?)\[\/list\]

请注意,这种方式在嵌套列表而不是背靠背列表时会出现问题。

【讨论】:

    【解决方案2】:

    如果您正在做的不仅仅是轻量级的 hack,而是更持久的东西,您可能希望转向真正的解析器。 Java 中的正则表达式特别慢(即使使用预编译模式)和匹配嵌套结构(尤其是 不同 嵌套结构,如 "foo [u][i] bar [s]baz[/s][/i] [/u]" ) 将是一种皇家痛苦。

    相反,请尝试使用基于状态的解析器,它会反复将句子分割成“foo”/(u)/“[i] bar [s]baz[/s][/i][/u] 等部分",并维护一组在遇到匹配构造分隔符时翻转的状态。

    【讨论】:

    • 感谢您的提醒,您知道一些资源或此类解析器的工作示例吗?速度真的是我最关心的^^
    • 如果您知道自己在做什么,Java 的内置正则表达式就足够快了。我同意正则表达式不是这项工作的正确工具,但性能不是原因。
    • 即使像将前缀与预编译的 Java 正则表达式匹配这样简单的事情也非常缓慢(打印文件中的所有匹配行,使用像“^mystring”这样的正则表达式:与简单的开始,与Perl中的相同程序相比,一个数量级...... wtf?)
    猜你喜欢
    • 2014-08-17
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多