【问题标题】:ANTLR or Regex?ANTLR 还是正则表达式?
【发布时间】:2010-03-05 14:11:58
【问题描述】:

我正在用 ASP.NET/C# 编写一个 CMS,我需要处理这样的事情,每个页面请求:

<html>
<head>
    <title>[Title]</title>
</head>
<body>
    <form action="[Action]" method="get">
        [TextBox Name="Email", Background=Red]
        [Button Type="Submit"]
    </form>
</body>
</html>

当然要替换 [...]。

我的问题是我应该如何使用 ANTLR 或 Regex 来实现它?什么会更快?请注意,如果我使用 ANTLR 实现它,我认为我将需要实现 XML,添加到 [..].

我需要实现参数等

编辑:请注意,我的正则表达式甚至可以看起来像这样:

public override string ToString()
{
    return Regex.Replace(Input, @"\[
                                    \s*(?<name>\w+)\s*
                                    (?<parameter>
                                        [\s,]*
                                            (?<paramName>\w+)
                                            \s*
                                            =
                                            \s*
                                            (
                                                (?<paramValue>\w+)
                                                |
                                                (""(?<paramValue>[^""]*)"")
                                            )
                                    )*
                               \]", (match) =>
                                  {
                                      ...
                                  }, RegexOptions.IgnorePatternWhitespace);
}        

【问题讨论】:

  • 我承认...我什至从未听说过 ANTLR...更不用说知道哪个更好用了。 Googlefoo 时间。
  • ANTLR 是一个解析器/词法分析器/语法工具包。它用于生成可以分析其他文本源并提取或翻译数据的源文件。它通常用于开发编译器等。

标签: c# .net regex performance antlr


【解决方案1】:

正确的工具是 RegEx 还是 ANTLR 或什至完全是其他工具,这在很大程度上取决于您的要求。 “使用什么工具”问题的最佳答案不应该主要基于性能,而是适合工作的正确工具

RegEx 是一个文本搜索工具。如果您需要做的只是从琴弦中拉出琴弦,那么它通常是首选的锤子。您可能需要一个工具来帮助您构建 RegEx。我推荐Expresso,但有很多选择。

ANTLR 是一个编译器生成器。如果您需要错误消息和解析操作或编译器附带的任何复杂内容,那么这是一个不错的选择。

看起来您正在做的是 XML 搜索/替换,您是否考虑过 XPath?这是我的建议。

为工作选择正确的工具绝对重要,在开发开始之前应该进行研究和思考。在所有情况下,重要的是在做出任何决定之前充分了解程序要求。你有项目的规范吗?如果不是这样,花时间想出一个可以为您节省所有时间,因为选择糟糕的工具可能会花费您。

希望有帮助!

【讨论】:

    【解决方案2】:

    关于 ANTLR 与 RegEx 的性能取决于 C# 中 RegEx 的实现。根据经验,我知道 ANTLR 足够快。

    在 ANTLR 中,您可以忽略某些内容,例如 XML。也可以找[]做进一步处理。

    RegEx 和 ANTLR 都支持您的参数类型(“等”我不确定)。

    在开发速度方面:RegEx 在这种情况下稍微快一些。您可以使用在线工具开发 RegEx 并在编辑 RegEx 时查看捕获组。 (谷歌@regex gskinner

    然后 ANTLR 对“错误消息”有完美的支持:它们显示行/列号以及错误所在。 RegEx 没有这种支持。

    RegEx 的一般方法是:创建“全局扫描”RegEx,它将在您的内容中找到正确的 [...] 组。然后让“...”被一个组捕获,然后为这个较小的内容应用另一个 RegEx(它根据等号和逗号分割内容)。这样您就拥有最佳的运行时性能并且易于开发。

    【讨论】:

    • 请在我的问题中查看我的正则表达式 - 你认为它会比这种情况下写得最好的 ANTLR 脚本更快吗?
    • 你的 RegEx 比一般的 ANTLR 实现慢,做同样的事情。但是,ANTLR 很难学习,也很难正确实现。因此,当您愿意花大量时间学习 ANTLR 的语法格式时,它会稍微快一些。您还可以优化此 RegEx:使用一个 RegEx 获取 [] 之间的所有内容,然后遍历这些内容以解析其参数。这更快,因为 RegEx 更小(这是使用性能和 RegEx 时的经验法则)。
    • 好的,我将使用 ANTLR 来实现它。我不在乎开发时间+我知道一点ANTLR。谢谢!无论如何,我仍在寻找更多的意见。明天我会再接受这个,如果有的话。
    【解决方案3】:

    如果您要解析的语言是正则,那么正则表达式当然是一种选择。如果不是,那么 ANTLR 可能是您唯一的选择。如果我正确理解这些问题,XML 是不规则的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多