(Java se refiere a la oferta) Coincidencia de expresiones regulares

1. Análisis de preguntas

Implemente una función que coincida con expresiones regulares, incluidas '.'y '*'.
El carácter del patrón '.'representa cualquier carácter y '*'el carácter anterior puede aparecer tantas veces como desee (incluidas 0 veces).

En esta pregunta, la coincidencia significa que todos los caracteres de la cadena coinciden con el patrón completo. Por ejemplo, la cadena "aaa" y el patrón "a.a"y "ab*ac*a"coinciden, pero con "aa.a"y "ab*a"no coinciden

Esta pregunta es principalmente para determinar si el segundo carácter del patrón*
Basado en esto, discutiremos la situación en detalle:
(1) Cuando el segundo carácter en el patrón no es *:

Si el primer carácter de la cadena coincide con el primer carácter del patrón, tanto la cadena como el patrón se desplazan hacia atrás en un carácter, y luego los caracteres restantes coinciden.
Si el primer carácter de la cadena no coincide con el primer carácter del patrón, Devuelve falso directamente

(2) Cuando el segundo carácter del patrón es *:

Si el primer carácter de la cadena no coincide con el primer carácter del patrón, el patrón se desplaza en 2 caracteres y la coincidencia continúa.
Si el primer carácter de la cadena coincide con el primer carácter del patrón, hay 3 métodos de coincidencia:

  • Después del cambio de modo dos caracteres, el equivalente a X*ser ignorado
  • La cadena se mueve hacia atrás en 1 carácter y el patrón se mueve hacia atrás en 2 caracteres
  • La cadena se mueve hacia atrás en un carácter y el patrón permanece sin cambios, luego el siguiente carácter continuará coincidiendo, porque * puede coincidir con varios dígitos

Segundo, el 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;
    }
}

Tres, resumen

La cuestión principal es el segundo *proceso y la posterior determinación de

Supongo que te gusta

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