-
正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。
1. 当模式第二位是*时 ,且第一位字符匹配,分三种匹配模式:
1. 把*当做0,就是忽略掉前两位X*,继续做匹配;
2. 把*当做是1,字符串后移一位,模式后移两位跳过这个*,继续匹配;
3. 把*当做 >1,即可能字符串的下一位与上一位相同,所以做匹配。
如果不匹配,模式后移两位。
2. 当模式第二位不是*时,如果第一位匹配则全部后移一位进行匹配,否则直接返回false。
public class Solution {
public boolean match(char[] str, char[] pattern)
{
if(str == null && pattern == null)
return false;
int strIndex = 0;
int patternIndex = 0;
return matchCore(str,strIndex,pattern,patternIndex);
}
public boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex){
//有效性检验:str到尾,pattern到尾, 匹配成功
if(strIndex == str.length && patternIndex == pattern.length){
return true;
}
if(strIndex != str.length && patternIndex == pattern.length){
return false;
}
//当第二位是*,且第一个字符匹配,分3种匹配模式;如不匹配,模式后移2位
if(patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*'){
if((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || (pattern[patternIndex] == '.' && strIndex != str.length)){
return matchCore(str, strIndex, pattern, patternIndex + 2) //模式后移两位,相当于忽略掉X*,把*当做0
|| matchCore(str, strIndex + 1, pattern, patternIndex + 2)//正常匹配,把*当做1,继续匹配下一位
|| matchCore(str, strIndex + 1, pattern, patternIndex); //把*当做1或者是更多,可能str下一位仍然是X
}
else {
return matchCore(str, strIndex, pattern, patternIndex + 2);
}
}
//模式第二位不是*,且字符串第一位和模式第一位都匹配,则都后移一位,否则直接返回false
if((strIndex != str.length && pattern[patternIndex] == str[strIndex]) || pattern[patternIndex] == '.' && strIndex != str.length){
return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
}
return false;
}
}