正则表达式是包含“.”和“*”的字符串,匹配规则为“.”可以代表任意的一个字符,“*”可以代表任意多个它前面的字符。
比如:abc和a.c以及ab*c以及abe*c都是匹配的。
正则表达式的匹配过程可以分为这样几种情况:
我们把当前正在匹配的字符称为第一个字符。
如果第二个字符是“*”:
如果当前字符是匹配的,那么当前字符可能重复0次,1次或n次。
如果当前字符不匹配,当前字符一定只能重复0次。
否则:
如果当前字符匹配,匹配下一个。
请看下图:
代码可以这样写:
bool match(char* str, char* pattern)
{
if(str == nullptr || pattern == nullptr)
return false;
return matchCore(str, pattern);
}
bool matchCore(char* str, char* pattern) {
if (*str == '\0' && *pattern == '\0')
return true;
if (*str != '\0' && *pattern == '\0')
return false;
if (*(pattern + 1) == '*') { //第二个字符是“*”
if (*pattern == *str || (*pattern == '.' && *str != '\0')) { //当前字符匹配
return matchCore(str, pattern + 2) || //匹配0次
matchCore(str + 1, pattern + 2) || //匹配1次
matchCore(str + 1, pattern); //匹配n次
}
else { //当前字符不匹配
return matchCore(str, pattern + 2); //跳过(匹配0次)
}
}
if (*pattern == *str || (*pattern == '.' && *str != '\0')) //第二个字符不是“*”,且当前字符匹配
return matchCore(str + 1, pattern + 1); //匹配下一个字符
return false; //没有一种匹配方案返回true,则返回false.
}
递归调用matchCore就能实现正则表达式的匹配了。