(Java относится к предложению) Сопоставление регулярных выражений

1. Анализ вопроса

Пожалуйста, реализуйте функцию для сопоставления регулярных выражений, включая '.'и '*'.
Символ в шаблоне '.'представляет любой символ, а '*'символ перед ним может появляться любое количество раз (включая 0 раз).

В этом вопросе соответствие означает, что все символы строки соответствуют всему шаблону. Например, строка «ааа» и шаблон "a.a"и "ab*ac*a"соответствие, но с "aa.a"и "ab*a"не совпадают

Этот вопрос в основном предназначен для того, чтобы определить, является ли второй символ в шаблоне*
Исходя из этого, мы подробно обсудим ситуацию:
(1) Когда второго символа в шаблоне нет *:

Если первый символ строки совпадает с первым символом в шаблоне, то и строка, и шаблон сдвигаются назад на один символ, а затем сопоставляются оставшиеся символы.
Если первый символ строки не соответствует первому символу в шаблоне, Вернуть false напрямую

(2) Когда второй символ в шаблоне *:

Если первый символ строки не соответствует первому символу шаблона, шаблон сдвигается на 2 символа и продолжает соответствовать.
Если первый символ строки совпадает с первым символом шаблона, существует 3 метода сопоставления:

  • После смены режима на два символа, эквивалент X*игнорирования
  • Строка перемещается назад на 1 символ, а образец перемещается назад на 2 символа.
  • Строка перемещается на один символ назад, а шаблон остается неизменным, тогда следующий символ будет продолжать соответствовать, потому что * может соответствовать нескольким цифрам

Во-вторых, код

/**
 * @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;
    }
}

Три, резюме

Главный вопрос - это второй *процесс и последующее определение

рекомендация

отblog.csdn.net/nanhuaibeian/article/details/108506603