正则表达式匹配

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) {
             return true;
         }
         //匹配失败
         else {
             return false;
         }
     }

你可能感兴趣的:(正则表达式匹配)