我正在.net中编写一个程序,用户可以在其中提供大量正则表达式。对于给定的字符串,我需要弄清楚哪个正则表达式匹配该字符串(如果多个匹配,我只需要匹配的第一个)。但是,如果存在大量正则表达式,则此操作可能需要很长时间。
我有点希望.net的类似于flex(快速词法分析器(不是Adobe Flex))可以让我快速指定大量正则表达式(O(n)根据维基百科for n = len(输入字符串))找出哪个正则表达式匹配。
另外,我不想实现自己的正则表达式引擎:)。
答案 0 :(得分:1)
什么?即使测试单个正则表达式是否匹配,通常也不能在O(n)时间内完成。你是从哪里获得这些信息的? Flex中有什么功能?我确信它必须是一些有限形式的正则表达式,而不是任意.NET正则表达式。
要处理任意正则表达式,最简单的方法是将正则表达式保存在List
中,然后逐个迭代每个正则表达式,直到找到匹配的正则表达式。
答案 1 :(得分:1)
在每个正则表达式中找到最大的常量文本块(如果超过某个阈值长度)并使用Karp-Rabin算法同时搜索任何这些字符串。对于每个匹配,运行该正则表达式以查看整个事物是否匹配。对于未包含在多字符串搜索中的每个正则表达式,直接搜索该正则表达式。
如果它们具有合理长度的常量子串,假设您有正则表达式的预处理时间,那么这应该可以为大量正则表达式提供良好的性能。
答案 2 :(得分:0)
快速网络搜索显示存在名为C#Lex的类似工具的lex。但由于我不使用.NET或C#,我不能说它是否好,以及它是否对你有用。
对于Java,我发现了JLex和JFlex,它们都生成了源代码。如果正则表达式在字面上“离线”编译(在应用程序之外),然后将其合并到应用程序类路径中,则使用这些似乎是合理的。 .NET版本的行为可能类似。