我了解如何在*、|和()等NFA中实现简单的正则表达式特性。
我想知道更复杂的特性,如^、$、[]、[-]等是如何实现的。它们看起来很简单,但我想知道这些表达式是如何转换成NFA的。
以这个正则表达式为例:^k[a-z0-9]{9}$。如何将其转换为NFA
发布于 2016-03-07 00:54:44
好的,让我们使用相同的表达式:
^ka-z0-9{9}$
集合
用于表示正则表达式的NFA中的每个转换通常表示为一个集合,而不是单个字符。
因此,"k“字符的转换表示为包含单个字符的集合,而"a-z0-9”表示为包含这些字符的集合。
一个regexpr NFA的特定实现可能有一个替代的、传统的、简化的单个字符转换,但这可能会被描述为优化细节。
锚点
请注意,在具有显式锚定字符的正则表达式中,格式为
ka-z0-9{9}
将等同于
(.)a-z0-9{9}(.)
因为这就是事实。然而,当正则表达式被锚定时,NFA就是它的字面意思。换句话说,NFA总是锚定在搜索空间的开头和结尾,如果没有锚定字符,(.*)就会在幕后自动放在正则表达式的开头或结尾。
重复
表达式{N}
这通常是通过在内部复制正则表达式N次来完成的。显式地扩展它。
以上是正则表达式NFA的典型实现。
发布于 2016-03-07 00:57:31
我想你可能想看看Thompson's construction algorithm。
https://stackoverflow.com/questions/35829166
复制相似问题