En mi trabajo he obtenido excelentes resultados con algoritmos de coincidencia de cadenas aproximados, como la distancia Damerau-Levenshtein, para hacer que mi código sea menos vulnerable a los errores ortográficos.Expresiones regulares difusas
Ahora tengo una necesidad de hacer coincidir cadenas con expresiones regulares simples como TV Schedule for \d\d (Jan|Feb|Mar|...)
. Esto significa que la cadena TV Schedule for 10 Jan
debe devolver 0, mientras que T Schedule for 10. Jan
debe devolver 2.
Esto se puede hacer generando todas las cadenas en la expresión regular (en este caso 100x12) y encontrar la mejor coincidencia, pero eso no es práctico.
¿Tiene alguna idea de cómo hacer esto de manera efectiva?
Creo que los lexers son más para tokenizar que para hacer coincidir. Si empiezo a dividir mi cadena, no podré reconocer los caracteres movidos de un token a otro. –
Puede que tenga que definir su problema como un problema de lexing/análisis, en lugar de como una expresión regular simple. Entonces podrías usar la distancia de Levenshtein en los tokens individuales. – Avi
Ya veo. Pero el enlace lexer que has enviado parece bastante determinista. ¿Qué sucede si en lugar de 'TV Schedule for 10 Jan' obtengo' TV Schedule for Jan 10'? Eso debería tener una distancia de 2, ya que se han transpuesto dos caracteres. Tal vez el lexer podría identificar subcadenas que parecen números o meses, pero entonces 'TV Schedule for Jan 10' o' TV Schedule for 10 Jan 2010' daría problemas. –