正则表达式匹配
10.正则表达式匹配
要求:给定一个字符串 (s) 和一个字符模式 (p)。实现支持 '.' 和 '*' 的正则表达式匹配。
- '.' 匹配任意单个字符。
- '*' 匹配零个或多个前面的元素
示例:
输入:
s = "mississippi"
p = "mis*is*p*."
输出: false
代码思路: 遍历模式串,查询s串是否能与p串匹配上。
public boolean isMatch(String s, String p) {
//两串的长度
int sLen = s.length();
int pLen = p.length();
//s串的当前检索位置,(这里通过s串是否满足p串作匹配)。
int currentIndex = 0;
//遍历p串
for (int i = 0; i < pLen; i++) {
char c = p.charAt(i);
//.号
if (c == '.') {
//后一个是 "*"
if (i + 1 < pLen && p.charAt(i + 1) == '*') {
//不做处理,交由后面*字符处理
}
//匹配任意
else {
if (currentIndex < sLen) {
//任意匹配
currentIndex++;
} else {
//匹配失败
return false;
}
}
}
//匹配“*”
else if (c == '*') {
if (i - 1 >= 0) {
//获取前一个字符
char last = p.charAt(i - 1);
//一个都没有就跳过及匹配0个last字符
if (currentIndex < sLen && s.charAt(currentIndex) != last && last!='.') {
//继续匹配,不做处理
} else {
if (i + 1 < pLen) {
//"*"后面还有字符
String temp_p = p.substring(i + 1);
//按照匹配个数为0,1,2,3的情况下,检测后面对应的两个字串能后匹配上
for (int j = currentIndex; j <= sLen; j++) {
String temp_s = s.substring(j);
if(j==currentIndex || last=='.' || last==s.charAt(j-1)){
if (isMatch(temp_s, temp_p)) {
return true;
}
}
else{
break;
}
}
return false;
} else {
//“*”后面没有字符
//前一个是"."
if(last=='.'){
//可以任意匹配,匹配总是成功
return true;
}
//前一个是其他,逐个匹配
while(currentIndex<sLen && s.charAt(currentIndex)==last){
currentIndex++;
}
}
}
}
} else {
//普通字符
if (i + 1 < pLen && p.charAt(i + 1) == '*') {
//后面是*,交由后面处理
continue;
}
//普通匹配
if (currentIndex < sLen && c == s.charAt(currentIndex)) {
currentIndex++;
} else {
//匹配失败
return false;
}
}
}
//成功匹配
if (currentIndex >= sLen) {
return true;
}
//匹配失败
else {
return false;
}
}