(Javaはオファーを指します)正規表現マッチング

1.質問分析

'.'およびなどの'*'正規表現に一致する関数を実装してください
パターン内の文字は'.'任意の文字を表し、'*'その前の文字は任意の回数(0回を含む)出現できます。

この質問では、一致とは、文字列のすべての文字がパターン全体と一致することを意味します。たとえば、文字列「AAA」とパターン"a.a""ab*ac*a"一致しますが、と"aa.a"とは"ab*a"一致しません

この質問は主に、パターンの2番目の文字が*
これに基づいて、状況を詳細に説明します。
(1)パターンの2番目の文字が次の場合*

文字列の最初の文字がパターンの最初の文字と一致する場合、文字列とパターンの両方が1文字後ろにシフトされ、残りの文字が一致します。
文字列の最初の文字がパターンの最初の文字と一致しない場合、直接falseを返す

(2)パターンの2番目の文字が次の場合*

文字列の最初の文字がパターンの最初の文字と一致しない場合、パターンは2文字分シフトされて一致し続けます。
文字列最初の文字がパターンの最初の文字と一致する場合、3つの一致方法があります。

  • モードが2文字シフトした後、X*無視されるのと同等
  • 文字列は1文字後ろに移動し、パターンは2文字後ろに移動します
  • 文字列は1文字後ろに移動し、パターンは変更されないままです。その後、*は複数の数字に一致する可能性があるため、次の文字が引き続き一致します。

第二に、コード

/**
 * @Auther: Yolo
 * @Date: 2020/9/10 08:49
 * @Description:
 */
public class Test_10 {
    
    
    public static void main(String[] args) {
    
    
        char[] str = {
    
    };
        char[] pattern = {
    
    };
        boolean result = match(str, pattern);
        System.out.println(result);
    }

    private static boolean match(char[] str, char[] pattern) {
    
    
        if (str == null || pattern == null) {
    
    
            return false;
        }
        int strIndex = 0;
        int patternIndex = 0;
        return matchCore(str, strIndex, pattern, patternIndex);
    }

    private static boolean matchCore(char[] str, int strIndex, char[] pattern, int patternIndex) {
    
    
        //有效性检验,str 到尾,pattern 到尾匹配成功
        if (strIndex == str.length && patternIndex == pattern.length) {
    
    
            return true;
        }
        //pattern 先到尾,匹配失败
        if (strIndex != str.length && patternIndex == pattern.length) {
    
    
            return false;
        }
        //模式第二个是 '*',且字符串第一个跟模式第一个匹配,分三种匹配;如果不匹配,模式后移两位
        if (patternIndex + 1 < pattern.length && pattern[patternIndex + 1] == '*') {
    
    
            if (strIndex != str.length && (pattern[patternIndex] == str[strIndex] || pattern[patternIndex] == '.')) {
    
    

                return matchCore(str, strIndex, pattern, patternIndex + 2)
                        || matchCore(str, strIndex + 1, pattern, patternIndex + 2)
                        || matchCore(str, strIndex + 1, pattern, patternIndex);
            } else {
    
    
                //模式后移两位,相当于 x* 被忽略
                return matchCore(str, strIndex, pattern, patternIndex + 2);
            }
        }
        //模式第二个不是 '*',且字符串第一个跟模式第一个匹配,则都后移一维,否则直接返回 false
        if (strIndex != str.length && (pattern[patternIndex] == str[strIndex] || pattern[patternIndex] == '.')) {
    
    
            return matchCore(str, strIndex + 1, pattern, patternIndex + 1);
        }
        return false;
    }
}

三、まとめ

主な問題は、2番目の*プロセスとその後の決定です。

おすすめ

転載: blog.csdn.net/nanhuaibeian/article/details/108506603