2010-01-15 24 views
9

Digamos que tengo la siguiente cadena:Regex a primera aparición solamente?

Ésta es una prueba por el bien de pruebas. Esto es solo una prueba. El fin.

y quiero seleccionar this is a test y this is only a test. ¿Qué demonios necesito hacer?

La siguiente expresión regular Probé produce un resultado ridículo:

this(.*)test (también quería capturar lo que había entre ella)

vuelve this is a test for the sake of testing. this is only a test

Parece que esto es probablemente algo fácil I' estoy olvidando

Respuesta

25

La expresión regular es codiciosa, lo que significa que capturará la mayor cantidad de caracteres que pueda pertenecer a la coincidencia .*. Para hacerlo no voraz intento:

this(.*?)test

El modificador ? hará capturar el menor número de caracteres como sea posible en el partido.

+0

Gracias ... eso es lo que pensaba. Lo probé en un probador de expresiones regulares y funciona. entonces la aplicación (EditPlus) que estoy usando para buscar y reemplazar magia aparentemente no reconoce el? cuantificador. –

+0

Según mi respuesta, es posible que no obtenga resultados perfectos si "este" y "prueba" están incrustados en otras palabras. Considere investigarlo, si eso pudiera ser un problema. –

3

* es un cuantificador codicioso. Eso significa que coincide tanto como sea posible, es decir, lo que está viendo. Dependiendo del soporte de lenguaje específico para regex, necesitará encontrar un cuantificador no codicioso. Por lo general, este es un signo de interrogación al final, como este: *?. Eso significa que dejará de consumir letras tan pronto como se satisfaga el resto de la expresión regular.

There is a good explanation of greediness here.

8

Andy E y Ipsquiggle tienen la idea correcta, pero quiero señalar que es posible que desee agregar una afirmación límite de palabra, que significa que no quiere tratar con palabras que tienen "este" o "prueba" en ellos, solo las palabras por sí mismos. En Perl y similar, eso se hace con el marcador "\ b".

Como es, this(.*?)test coincidiría con "cardos son los mejores", que probablemente no desee.

El patrón que desea es algo como esto: \bthis\b(.*?)\btest\b

+0

+1, definitivamente algo vale la pena pensar –

Cuestiones relacionadas