代码之家  ›  专栏  ›  技术社区  ›  Jack Edmonds

如何快速测试大量正则表达式并知道哪一个匹配?

  •  3
  • Jack Edmonds  · 技术社区  · 15 年前

    我正在.NET中编写一个程序,用户可以在其中提供大量正则表达式。对于给定的字符串,我需要找出哪个正则表达式与该字符串匹配(如果多个匹配,我只需要第一个匹配的)。但是,如果有大量的正则表达式,则此操作可能需要很长时间。

    我有点希望有类似于.NET的flex(快速词汇分析器(而不是adobe flex))的东西可以让我快速地指定大量的正则表达式(根据wikipedia for n=len(input string)),找出匹配的正则表达式。

    另外,我不希望实现自己的正则表达式引擎:)。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Charles    15 年前

    找到每个regex中最大的常量文本块(如果超过某个阈值长度),并使用karp-rabin算法同时搜索这些字符串。对于每一个匹配,运行该regex以查看整个事件是否匹配。对于不包含在多字符串搜索中的每个regex,直接搜索该regex。

    如果大量正则表达式具有合理的长度常量子字符串,这将为它们提供良好的性能,前提是您有足够的预处理时间来处理正则表达式。

        2
  •  1
  •   Mark Byers    15 年前

    什么?即使测试单个正则表达式是否匹配,通常也不能在O(n)时间内完成。你从哪里得到这些信息的?这个在flex中是什么功能?我确信它一定是某种有限形式的正则表达式,而不是任意的.NET正则表达式。

    要处理任意正则表达式,简单的方法是将正则表达式存储在 List 简单地逐个迭代每个正则表达式,直到找到匹配的表达式为止。

        3
  •  0
  •   Christian Semrau Louis Wasserman    15 年前

    快速的网络搜索显示存在一个类似lex的工具,名为 C#Lex . 但由于我不使用.NET或C,所以我不能说它是否好,是否对您有用。

    对于Java,我找到了JLex和JFLeX,它们都生成源代码。只有当正则表达式被逐字编译为“脱机”(在应用程序外部)然后合并到应用程序类路径中时,使用这些似乎才合理。.NET版本的行为可能类似。