Repo: https://github.com/umarquez/100DaysOfC0D3/tree/master/21-textsearch

Este algoritmo consiste en comparar cada caracter del texto hasta encontrar una coincidencia con el primer caracter de la cadena a buscar, para continuar comparando el resto de caracteres de ambas cadenas hasta finalizar la cadena a buscar o en el momento en que los caracteres dejen de coincidir.

En el caso de Go, podemos aprovechar el hecho de que una cadena de texto es un []rune y podemos obtener solo una sección del slice.

Para entender mejor este procedimiento, vamos a aplicarlo en el siguiente ejemplo.

Ejemplo

Supongamos que debemos encontrar la palabra Mundo dentro de la frase ¡Hola Mundo!.

Paso 1

Recorremos la cadena hasta encontrar una coincidencia con el primer caracter de la cadena a buscar.

Paso 2

Comparamos cada caracter del resto de la cadena dentro del texto; si primero llegamos al final de la cadena a buscar, hemos encontrado una coincidencia completa; de lo contrario, si en algún momento los caracteres de ambas cadenas dejaran de coincidir, se tratará de una coincidencia parcial, por lo que deberemos buscar una coincidencia con el primer carater de la cadena a buscar a partir de la siguiente posición en el texto completo.

Implementación en Go

Vamos a censurar unos cuantos diálogos de Samuel L. Jackson obtenidos de: https://slipsum.com/

Para esto vamos a preparar una lista de palabras a buscar dentro de un loop que recorrerá cada caracter del texto, una vez que encontremos una coincidencia obtendremos n caracteres a partir de la posición actual, donde n = len(), si esta coincide con el total de la palabra:

  • Almacenamos la posición del inicio de la coincidencia.
  • Reemplazamos los caracteres que forman la palabra.
  • Repetimos hasta terminar de recorrer todo el texto.
  • Una vez finalizado, retornaremos la lista de coincidencias (que almacenaremos en una tabla hash) y el texto “censurado” resultante del proceso.

Podemos observar que esta búsqueda no es muy precisa y que debemos realizar algunas validaciones adicionales para evitar reemplazar falsos positivos como glass o massage pero en general funciona.