【模式匹配】正则表达式匹配,表示数值的字符串

2019-04-14 08:25发布

class="markdown_views prism-atom-one-light">

面试题19:正则表达式匹配

请实现一个函数用来匹配包含’.’和’*’的正则表达式。模式中的字符’.’表示任意一个字符,而’*’表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串”aaa”与模式”a.a”和”ab*ac*a”匹配,但与”aa.a”及”ab*a”均不匹配。
基本可以看成编译原理的parser问题,但是找出文法不容易,也没必要为每种情况写个匹配的函数(递归下降),可以画个NFA分析一下,然后在递归里直接用字符串游标的移动记录匹配情况。 #include using namespace std; bool matchCore(const char* str, const char* pattern); // 参数: // str: 要匹配的字符串首地址 // pattern: 要匹配的模式串首地址 // 返回值: // 能否匹配成功 bool match(const char* str, const char* pattern) { //非空校验 if(str == nullptr || pattern == nullptr) return false; //调用匹配的函数,递归地进行匹配 return matchCore(str, pattern); } // 参数: // str: 要匹配的字符(子)串首地址 // pattern: 要匹配的模式(子)串首地址 // 返回值: // 从此位置向后能否匹配成功 bool matchCore(const char* str, const char* pattern) { if(*str == '