题目描述
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。
JAVA
public class StyleMatch {
public static boolean match(String str,String pattern){
return matchCore(str,0,pattern,0);
}
public static boolean matchCore(String str, int index1,String pattern,int index2){
//对于str匹配完了,pattern还没匹配完的情况
if(index1==str.length()){
//如果正则串长度为奇数,肯定不匹配 比如'.','ab*';\
String p=pattern.substring(index2,pattern.length());
System.out.println(p.length());
if(p.length()%2!=0) return false;
int i=1;
//'a*b*c*'
while(i<p.length()){
if(p.charAt(i)!='*' ) return false;
i+=2;
}
return true;
}
if(index2>pattern.length() || index1>str.length()){
return false;
}
if(index1==str.length()&& index2==pattern.length()){
return true;
}
//没有匹配完全
if(index1!=str.length() && index2==pattern.length()){
return false;
}
//匹配当前字符
//模式的第二个字符是’*‘
if(index2<(pattern.length()-1)&&pattern.charAt(index2+1)=='*') {
//第一个字符能匹配
if (pattern.charAt(index2) == str.charAt(index1) || (pattern.charAt(index2) == '.' && index1 != str.length())) {
return matchCore(str, index1 + 1, pattern, index2 + 2) ||
matchCore(str, index1 + 1, pattern, index2) ||
matchCore(str, index1, pattern, index2 + 2); //忽略*
} else {//第一个字符匹配不上
return matchCore(str, index1, pattern, index2 + 2);
}
}
//模式的第二个字符不是*
if(pattern.charAt(index2) == str.charAt(index1) || (pattern.charAt(index2) == '.' && index1 != str.length())){
return matchCore(str,index1+1,pattern, index2+1);
}
return false;
}
public static void main(String[] args) {
String str="";
String pattern=".*";
boolean res=StyleMatch.match(str,pattern);
System.out.println(res);
}
}