题目:
实现一个函数用来匹配包含' , ' 、' * ' 的正则表达式。
模式中的' . '表示任意一个字符,而' * '表示它前面的字符可以出现任意次(含0次)
在本题中,匹配指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式
"a.a" 和"ab*ac*a"匹配,但和"aa.a"和"ab*a不相配"。
思路:
可以使用递归解决。
将正则表达式的首地址指针设为 pattern , 将待匹配字符串的首地址指针设为 str。
递归出口:1.当pattern 和 str 都指向'\0',并且在中间匹配的过程中没有返回false, 说明中间的每一步都是匹配的。所以返回true
2. 当 pattern 已经指向 '\0'但是 str 没有指向 '\0',说明不匹配,直接返回false。
还有一种情况是 pattern 还没有指向 '\0',str 已经指向'\0',这个可以返回false吗?
开始没有仔细思考的时候觉得可以,但是仔细思考后发现其实不行。
如: pattern = ".*", str = "",这时str指向'\0',pattern 指向 '.',此时易得应该返回true,所以递归返回条件只有1和2.
后面还是'*'的处理情况比较复杂:
'*'的处理:
1. 将'字符*' 直接忽略(因为'*'也可以匹配'字符'重复0次)。也即:match_core(str, pattern+2)
2. 将'字符*'当作一个'字符'。也即: match_core(str+1, pattern+2)
3. 将'字符*'当作多个'字符'。也就是说模式保持不变,字符指针向后匹配下一个字符,也即:match(str+1, pattern)
细节见代码!