Búsqueda simple de texto | Simple text search
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(<palabra_a_buscar>), 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.