我并不陌生于使用正则表达式,我理解它们基于有限状态机的基本原理。
然而,我的算法分析能力不太行,我不太明白正则表达式与基本的线性搜索相比如何。我问这个问题是因为从表面上看,它似乎是一个线性数组搜索(如果正则表达式很简单的话)。
我可以去哪里学习更多关于实现正则表达式引擎的内容?
我并不陌生于使用正则表达式,我理解它们基于有限状态机的基本原理。
然而,我的算法分析能力不太行,我不太明白正则表达式与基本的线性搜索相比如何。我问这个问题是因为从表面上看,它似乎是一个线性数组搜索(如果正则表达式很简单的话)。
我可以去哪里学习更多关于实现正则表达式引擎的内容?
这是最受欢迎的大纲之一:正则表达式匹配可以简单而快速。对一个字符串运行经过DFA编译的正则表达式确实是O(n)的,但可能需要高达O(2^m)的构建时间/空间(其中m = 正则表达式大小)。
你是否熟悉“确定性/非确定性有限状态自动机”这个术语?
真正的正则表达式(当我说真正的时,指的是那些可以识别正则语言的正则表达式,而不是几乎每种编程语言都包含带有反向引用等内容的正则表达式)可以转换为DFA/NFA,并且两者都可以在编程语言中以机械方式实现(NFA可以转换为DFA)。
您需要做的是:
这样,给定一个正则表达式,您可以将其转换为DFA并运行它,以查看它是否与指定的文本匹配。
这可以在O(n)
中实现,因为DFA不会向后退(像图灵机一样),所以它要么匹配字符串,要么不匹配。这是假设您不考虑重叠的匹配,否则您将不得不返回并重新开始匹配...
:)
- Kobi
O()
符号中属于哪种复杂度,但它肯定不是线性的。 - sarnold