2012-04-09 19 views
6

Tengo una expresión regular generada automáticamente, lo que básicamente es un gran "o" grupo de esta manera:¿Existe un grupo codicioso "o" en expresiones regulares?

(\bthe\b|\bcat\b|\bin\b|\bhat\.\b|\bhat\b) 

me he dado cuenta de que en caso de

hat. 

Sería coincidir "sombrero" solo, no "sombrero" como yo quiera. ¿Hay alguna manera de hacerlo más codicioso?

ACTUALIZACIÓN: se olvidó de los límites de palabras, lo siento por eso.

+3

¿Quiere decir además de cambiar el orden de los artículos? –

+0

@TimCooper, lo siento por engañarlo, me olvidé de los límites de las palabras. Básicamente, quiero permitir que coincidan solo unos pocos límites particulares ("." En el ejemplo). – Andrew

+1

Factoriza los límites de las palabras fuera de los parens. *** ¡No lo pongas al lado de los personajes que no sean palabras! No hace lo que crees que hace. Lo mejor es no utilizarlo en absoluto si no entiende lo que '\ b' hace, y no lo hace. Luego ordena por longitud, más tiempo primero. – tchrist

Respuesta

9

Pon hat\. antes de hat en la expresión regular. La primera expresión coincidente en una alternancia gana. hat coincide con hat. por lo que hat\. nunca se verifica.

Una mejor manera sería simplemente escribir esa parte como hat\.? en lugar de hat\.|hat. Eso hace que el período sea opcional, por lo que no necesita dos términos en la alternancia.

Después de tu edición:

No hay límite de palabra entre . y, digamos, un espacio (ambos son caracteres que no son de texto). Entonces, \bhat\.\b solo coincidirá en cosas como hat.x, donde otra letra sigue inmediatamente al punto. Esto significa que, por ejemplo, una oración, hat será la que coincida. Veo que encontraste una solución, sin embargo.

+0

Tiene toda la razón en este caso. Olvidé los límites de las palabras, por favor revisa mi pregunta. – Andrew

+0

Ese también fue mi pensamiento: '\ b (el \ b | cat \ b | in \ b | hat \ b \.?)' –

Cuestiones relacionadas