参考资料:http://blog.chinaunix.net/uid-26822401-id-3150018.html
题目要求:string s
是要检测的字符串,string p
是正则表达式。要求正则表达式完全匹配字符串。
正则表达式只包含普通字符和:
‘.’ Matches any single character.
‘*’ Matches zero or more of the preceding element.
先上代码:
class Solution {
public:
bool isMatch(string s, string p) {
return matchHere(s.c_str(), p.c_str());
}
// text为测试字符串,reg为正则表达式
bool matchHere(const char* text, const char* reg) {
if (reg[0] == '\0')
return *text == '\0';
if (reg[1] == '*')
return matchStar(reg[0], text, reg + 2);
if (*text != '\0' && (reg[0] == '.' || reg[0] == *text))
return matchHere(text + 1, reg + 1);
return false; // 如果以上条件都都不满足,说明匹配失败
}
// c为通配符匹配的字符
bool matchStar(char c, const char* text, const char* reg) {
do {
if (matchHere(text, reg))
return true;
} while (*text != '\0' && (*text++ == c || c == '.'));
return false; // text从初始位置到末尾全都匹配失败,则最终结果就是匹配失败。
}
};
先看主函数bool isMatch(string s, string p)
,它直接调用函数bool matchHere(const char* text, const char* reg)
并返回它的返回值,因此匹配与否要看matchHere
函数。
接着看matchHere
函数。先看11 、12行。这两行说明:text
指向的字符匹配目前reg
指向的字符,那么两个指针都向前移动一位并接着调用matchHere
过程。再看10、11行,这两行说明:在匹配过程中遇到了正则表达式的通配符,那么就要对含有通配符的情况进行检测,这通过调用bool matchStar(char c, const char* text, const char* reg)
完成。最后看8 、9行。这两行说明:正则表达式已经匹配完了,由于题目要求是完全匹配,所以这时只有text
也匹配完成了才能说正则表达式完全匹配字符串。
最后看matchStar
。这个函数检测遇到了通配符的情况。由于*
匹配0个或多个,所以11行return matchStar(reg[0], text, reg + 2);
才直接将text
传入该函数。matchStar
函数执行第一遍循环时测试的就是通配符匹配0个的情况。如果匹配失败,令text
一直往前移动再进行匹配,直到text
结束或者匹配成功。
以上过程执行到最后,都是要在8、9行处返回,只有当执行到最后,text
和reg
都走到了末尾才能算是完成了匹配。