2010-03-30 9 views
8

que tienen una cadena de entrada que es una dirección de directorio:expresión regular más larga posible a juego

Ejemplo: ProgramFiles/Micro/Telephone

y quiero hacerlo coincidir con una lista de palabras de forma muy estricta:

Ejemplo: Tel|Tele|Telephone

Quiero hacer coincidir con Telephone y no Tel. Ahora mismo mi expresión regular se ve así:

my($output) = ($input =~ m/($list)/o); 

la expresión regular anterior coincidirá contra Tel. ¿Que puedo hacer para arreglarlo?

+0

¿Cuál es su preferencia? – eyelidlessness

+0

¿En qué idioma estás trabajando? – EsotericNonsense

+0

No siempre es posible colocar la coincidencia preferida; por ejemplo, actualmente estoy generando una lista de palabras clave posibles para que coincida con el concepto de "Número fijo"; mis datos son multilenguaje y desordenados Podría ver "Flt" o "Apartamento" o "Apt", o "Número de apartamento", o "Apartamento No" ... ¡La lista continúa! Intentar crear y mantener una expresión regular que coincida con todos estos conceptos, donde todo está exactamente en el orden correcto, es casi prácticamente imposible. – Nick

Respuesta

9

Si desea un partido entero palabra:

\b(Tel|Tele|Telephone)\b 

\b es un límite de palabra de anchura cero. El límite de palabras en este caso significa la transición desde o hacia un carácter de palabra. Un carácter de palabra (\w) es [0-9a-zA-Z_].

Si simplemente desea coincidir con el más largo en una coincidencia parcial de palabra, coloque primero la más larga. Por ejemplo:

\b(Telephone|Tele|Tel) 

o

(Telephone|Tele|Tel) 
+1

No se puede garantizar que mi lista tenga primero la palabra más larga. – syker

+0

La palabra límite funciona el pensamiento. Pero no puedo seguir el razonamiento de por qué funcionó. – syker

+0

@syker si desea coincidencias parciales, la forma más fácil de construir la expresión es ordenar la lista de palabras, invertir el orden y luego unir todas las palabras con '|' en el medio y eso le dará el orden correcto de palabras grandes con coincidencias de palabras más pequeñas. – cletus

2

Cambiar las órdenes: Tel|Tele|Telephone a Telephone|Tele|Tel. Por el algoritmo de la expresión regular, se busca la alternancia de izquierda a derecha, si encuentra una coincidencia, eso es todo, sin concordancia ambiciosa. Por ejemplo:/a | ab | abc/trabajando en "abc" coincide con "a" en lugar del "abc" más codicioso.

o utilice las expresiones coincidentes.

Tel(?:e(?:phone)?)? 
+0

¿Qué tan seguro es confiar en este comportamiento? ¿Está en la especificación de expresiones regulares o algo por el estilo? Sería realmente bueno para mí poder confiar en el formulario '(XXX | XX | X)' para lo que estoy implementando – Hashbrown

-1

¿Qué tal si intentamos encontrar una coincidencia, siempre y cuando la coincidencia más larga no esté en la entrada? Algo como:

Buscar teléfono, O encontrar tel, y tele donde el teléfono no está en ninguna parte de la entrada. Así que, para empezar a hacer que se vea como una expresión regular:.

(teléfono) O caracteres sin teléfono, seguido de (tel | tele) seguido de caracteres sin teléfono

(telefónicos | * (teléfono) {0 }. * (tel | tele). * (teléfono) {0}. *)

¿Tiene sentido?

Cuestiones relacionadas