正则表达式匹配

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;
         }
     }
posted @ 2021-09-05 17:06  -Rocky-  阅读(129)  评论(0编辑  收藏  举报