正则表达式
请设计一个函数用来匹配包含’.‘和’‘的正则表达式,’.‘表示匹配任意字符,’'表示它前面的字符可以任意次数。例如字符串"aaa"与模式a.a和abaca匹配,不与aa.a和ab*a匹配
public class Offer25 {
public static void main(String[] args) {
char[] str = new String("fsffffas").toCharArray();
char[] p1 = new String("fs*.f*asf*").toCharArray();
System.out.println(match(str,p1));
}
/**
* 思路:逐步遍历字符串,进行字符比较
* 1.如果字符为'.',可以为任意字符
* 2.如果字符为'*',可以出现三种情况,字符可能出现0次,1次,n次
*/
public static boolean match(char[] str, char[] pattern) {
int PIndex = 0;
for (int i = 0; i < str.length; i++) {
//分情况
//字符比对相等:查看pattern的后一个字符是不是*,如果是将str走到不是相等字符的位置
//字符比对不相等:如果为'.',则过;如果为下一个字符'*'且下下个字符相等,也过。
if (str[i] == pattern[PIndex]) {
//越界问题
if ((PIndex + 1) < pattern.length && pattern[PIndex + 1] == '*') {
//将str字符走到不匹配的位置
while (true) {
if (str[i + 1] == pattern[PIndex]) {
i++;
} else {
break;
}
}
PIndex += 2;
} else {
PIndex++;
continue;
}
} else {
if (pattern[PIndex] == '.') {PIndex++; continue;}
//越界问题
if ((PIndex + 2) < pattern.length && pattern[PIndex + 1] == '*' && pattern[PIndex + 2] == str[i]) {
//越界问题
if ((PIndex + 3) < pattern.length) PIndex += 3;
continue;
}
return false;
}
}
return true;
}
}