Regex a la primera ocurrencia solamente?

Digamos que tengo la siguiente cadena:

esta es una prueba por el bien de las pruebas. Esto es solo una prueba. El fin.

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

El siguiente Regex que probé produce un resultado ridículo:

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

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

Parece que esto es probablemente algo fácil que me estoy olvidando.

La expresión regular es codiciosa, lo que significa que capturará tantos personajes como sea posible que caigan en la coincidencia. .* . Para hacerlo no codicioso, intente:

this(.*?)test

El ? El modificador hará que capture la menor cantidad de caracteres posible en el partido.

Andy E y Ipsquiggle tienen la idea correcta, pero quiero señalar que es posible que desee agregar una afirmación de límite de palabras, lo que significa que no quiere tratar con palabras que tienen “this” o “test” en ellas. las palabras solas En Perl y similar, eso se hace con el marcador “\ b”.

Tal como está, this(.*?)test con “los cardos son los más grandes”, lo que probablemente no quieras.

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

* es un cuantificador codicioso. Eso significa que coincide tanto como sea posible, es decir, lo que estás 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 rest de la expresión regular.

Hay una buena explicación de la codicia aquí.

Para mí, simplemente elimine / g funcionó.

Ver https://regex101.com/r/EaIykZ/1