Preguntas sobre el cepillado del botón de encendido: 10. Coincidencia de expresiones regulares

Requisitos de la asignatura

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí

toda la idea

Principalmente me dividí en cuatro situaciones para hacerlo:

  • .
  • . *
  • X
  • X*

Los dos primeros tipos comienzan con '.', Los dos últimos comienzan con x. Juzga cada situación por separado.

Para los dos casos de '.' Y'x ', es fácil juzgar directamente si syp son iguales.

Para los dos casos con '*', adopté un método recursivo. Porque no se sabe cuántos de los mismos caracteres en s deben ser "tragados" por la expresión de cierre en p. Entonces hago una autorrecursión cada vez que muevo el puntero de s. Vuelva a pasar la subcadena de sy la subcadena de p a la función para el juicio recursivo, devuelva verdadero si es factible y mueva el puntero de s hacia adelante para continuar el juicio si no es factible.

Un poco similar al método de análisis de descenso recursivo en el análisis de sintaxis del principio de compilación:
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
preste atención a los tres pasos de c, dye en la figura anterior, que muestran cómo retroceder después de una coincidencia incorrecta

Código

bool isMatch(string &s, string &p)
{
    
    
  int indexS = 0, indexP = 0;
  string substrS, substrP;
  while (indexP < p.size() && indexS < s.size())
  {
    
    
    if (p[indexP] == '.')
    {
    
    
      // .*
      if (indexP+1 < p.size() && p[indexP+1] == '*')
      {
    
    
	      substrP = p.substr(indexP + 2, p.size() - indexP - 2);
	      while (indexS < s.size())
	      {
    
    
	        substrS = s.substr(indexS, s.size() - indexS);
	        if (isMatch(substrS, substrP))
	        {
    
    
	          return true;
	        }
	        ++indexS;
	      }
	      indexP += 2;
      }
      //.
      else
      {
    
    
        ++indexP;
        ++indexS;
      }
    }
    else
    {
    
    
      //x*
      if (indexP+1 < p.size() && p[indexP + 1] == '*')
      {
    
    
        if (indexP + 2 >= p.size())
        {
    
    
          substrP = "";
        }
        else
          substrP = p.substr(indexP+2, p.size() - indexP - 2);
        while (indexS < s.size() && s[indexS] == p[indexP])
        {
    
    
          substrS = s.substr(indexS, s.size() - indexS);
          if (isMatch(substrS, substrP))
          {
    
    
            return true;
          }
          ++indexS;
        }
        indexP += 2;
      }
      //x
      else
      {
    
    
        if (p[indexP++] != s[indexS++])
        {
    
    
          return false;
        }
      }
    }
  }
 
  if (indexS == s.size() && indexP == p.size())
  {
    
    
    return true;
  }
  else
  {
    
    
    if (indexP < p.size())
    {
    
    
      while (indexP < p.size())
      {
    
    
        //尾部剩余闭包表达式
        if (indexP+1 < p.size() && p[indexP + 1] == '*')
        {
    
    
          indexP += 2;
        }
        else
          return false;
      }
      return true;
    }
    else
      return false;
  }
}

Que aprendí

1. Cuando necesite obtener el valor del índice + 1 en la matriz, primero debe determinar si el índice + 1 está fuera de rango.

2. Utilice la función de cadena substr para obtener la subcadena que comienza con index:
str.substr(index, str.size()-index);

3. Cuando utilice el incremento o decremento automático en la condición de juicio de bucle, debe tener en cuenta: si el programa no atraviesa ni siquiera un ciclo, si la operación de incremento o decremento automático es razonable

resultado

Inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/youyadefeng1/article/details/113406000
Recomendado
Clasificación