题目:
给定一个字符串(s)和一个字符模式(p)。实现支持'.'和'*'的正则表达式匹配
'.':匹配任意字符串
'*':匹配零个或多个前面的元素
匹配应该覆盖整个字符串(s),而不是部分
说明:
s可能为空,且包含从a-z的小写字母
p可能为空,且包含从a-z的小写字母及字符.和*.
解析:
代码:
<script>
const regMatching = (str, mode) => {
//对模式变量进行正则筛选
let modeArr = mode.match(/([a-z.]\*)|([a-z]+(?=([a-z.]\*)|$))/g);
//计算光标,从0开始
let cur = 0;
let strLen = str.length;
//遍历模式
for (let i = 0, len = modeArr.length, m; i < len; i++) {
//对于模式分为三类:.*|a*|cdef
m = modeArr[i].split('');
//如果第二位是*,表示是有模式的
if (m[1] === '*') {
if (m[0] === '.') {
cur = strLen;
break;
} else {
while (str[cur] === m[0]) {
cur++;
}
}
} else {
for (let j = 0, jl = m.length; j < jl; j++) {
if (m[j] !== str[cur]) {
return false;
} else {
cur++;
}
}
}
}
return cur === strLen;
}
console.log(regMatching('aaa', 'caa*'));
console.log(regMatching('aaabc', 'a*bc'));
console.log(regMatching('aaabc', 'a*.*'));
</script>