2010-03-24 16 views

Respuesta

3

Puede usar una métrica de (des) similitud, como edit distance. Por ejemplo, la distancia de edición entre vi.agra y viagra es 1.

A continuación, se determina que una palabra dada es la misma que la palabra correo no deseado, si la distancia de edición entre ellas se encuentra por debajo de un cierto umbral como, por ejemplo, 2.

Pero si realmente desea usar una expresión regular, puede usar algo como /[^a-zA-Z0-9-\s]/ para eliminar la puntuación de la palabra. Pero, de nuevo, no identificaría algo como viZagra como la misma palabra que viagra.

2

Las expresiones regulares no parecen ser la herramienta adecuada para resolver esto. Sino como un intento de responder a ella sólo porque es interesante, una forma sencilla sería la de hacer algo como esto:

/v.?i.?a.?g.?r.?a/ 

coincidiría con 0 o 1 caracteres entre cada letra.

1

Eso depende de qué tan ampliamente quiera hacer coincidir. El siguiente coincidirá con cualquier secuencia contigua de no está en blanco-o-Word-caracteres intercalados entre las letras:

/p[^\s\w]*h[^\s\w]*a[^\s\w]*r[^\s\w]*m[^\s\w]*a[^\s\w]*c[^\s\w]*y/ 

Puede construir esta expresión regular en el código. Por ejemplo, en Perl:

$re = join("[^\\s\\w]*", split("", "pharmacy")) 

En última instancia, expresiones regulares probablemente no satisfacer todas sus necesidades, sin embargo.

Cuestiones relacionadas