(Java se refere à oferta) Correspondência de expressão regular

1. Análise da questão

Implemente uma função para corresponder às expressões regulares, incluindo '.'e '*'.
O caractere no padrão '.'representa qualquer caractere e '*'o caractere antes dele pode aparecer qualquer número de vezes (incluindo 0 vezes).

Nesta questão, correspondência significa que todos os caracteres da string correspondem a todo o padrão. Por exemplo, a string "aaa" e o padrão "a.a"e "ab*ac*a"correspondem, mas com "aa.a"e "ab*a"não correspondem

Esta questão é principalmente para determinar se o segundo personagem no padrão*
Com base nisso, discutiremos a situação em detalhes:
(1) Quando o segundo caractere no padrão não é *:

Se o primeiro caractere da string corresponder ao primeiro caractere do padrão, a string e o padrão serão deslocados em um caractere e os caracteres restantes serão correspondidos.
Se o primeiro caractere da string não corresponder ao primeiro caractere do padrão Retornar falso diretamente

(2) Quando o segundo caractere no padrão é *:

Se o primeiro caractere da string não corresponder ao primeiro caractere do padrão, o padrão será alterado em 2 caracteres e continuará a corresponder.
Se o primeiro caractere da string corresponder ao primeiro caractere do padrão, existem 3 métodos de correspondência:

  • Após a mudança de modo de dois caracteres, o equivalente a X*ser ignorado
  • A string é movida para trás em 1 caractere e o padrão é movido para trás em 2 caracteres
  • A string é movida para trás em um caractere e o padrão permanece inalterado, então o próximo caractere continuará a ser correspondido, porque * pode corresponder a vários dígitos

Em segundo lugar, o código

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

Três, resumo

A questão principal é o segundo *processo e a posterior determinação de

Acho que você gosta

Origin blog.csdn.net/nanhuaibeian/article/details/108506603
Recomendado
Clasificación