实现正则库 1
正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE),又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。 许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成regex,单数有regexp、regex,复数有regexps、regexes、regexen。
由于这篇文章的重点在正则表达式的实现,而非正则表达式的使用。故我将忽略正则表达式的详细介绍,可参考:
在正式开始实现之前,我们来定义一个正则表达式的子集方便第一步的实现——一个完整的正则表达式是:
非确定有限状态自动机(Nondeterministic Finite-state Automata)与一般的状态机不同,NFA 在接受一个输入时,不只从一个状态决定是否转移或转移到哪个状态,而是由一组状态 (A) 通过判断输入来得到一组转移之后的状态 (B)。而之前的一组状态 (A) 是由上一次得到的状态所等价的所有状态的集合。
有上面的叙述可以知道,NFA 虽然不是确定的,但是它可以知道哪一个状态率先到达最终状态。从这个性质我们可以联系两点:
由此,我们找到了解决表达 NFA 的数据结构:图(显然是有向的,因为状态判断是单向的)。也有了匹配的方法:深度遍历。剩下的就是用代码一步一步实现了。
class NFA { private: digraph graph; std::string re; // regular expression public: NFA(const std::string& regexp); // constructor bool recognize(const std::string& txt); // whether the given string match the pattern };
原文:https://www.cnblogs.com/starship-huang/p/regex_1.html