让我们假设这些正则表达式是真正的正则表达式。然后,每个都可以转换为Nondeterministic Finite Automaton,它可以转换为Deterministic Finite Automaton,可以在输入长度的 O(n) 时间内进行评估。
但它并没有解决同时匹配多个正则表达式的问题。我们可以通过创建一个看起来像这样的单个正则表达式来做到这一点:(regexp1|regexp2|...)
,并将其转换为单个 NFA/DFA。在自动机的分支中添加一些工具,以跟踪哪个特定的正则表达式生成了与输入匹配的路径,并且您已经有了匹配器,输入字符串的长度仍然为 O(n)。
这种技术不支持任何使语言非常规的“正则表达式”功能,例如反向引用。
另一个缺点是生成的 DFA 可能很大。也可以直接评估 NFA,这可能更慢但具有更好的记忆行为。
实际上,用代码表达这个想法也很容易,而不用担心自动机的东西。只需使用匹配组:
combined_regexp = (regexp1)|(regexp2)|...
在评估时,只需查看哪个组与输入匹配。
请记住,大多数正则表达式实现/库在某些极端情况下的行为非常糟糕,在这种情况下,它们可能需要指数级的时间来编译或匹配正则表达式。我不确定在实践中有多少问题。Google 的RE2库是专门设计为不具有这种病态行为的库,但可能还有其他库。
另一个问题可能是,除非您的正则表达式实现专门宣传 O(n) 行为,否则它可能只是依次尝试每个替代方案。在那种情况下,这种方法不会给你带来任何东西。