He leído tantas respuestas, y siempre es para usar el? operador. No estoy seguro de lo que me estoy perdiendo.
Dada una cadena de muestra como:
the beginning stuff:0:evnt:some random stuff:MISTER GREEN:more stuff:1:evnt:again random stuff:MISS SCARLET:the rest of the stuff
¿Qué patrón puedo usar para obtener el "1" antes de "MISS SCARLET"? Sin depender de saber qué hay en ninguna de las partes aleatorias. Sé que siempre será un dígito seguido de ":evnt" (sin comillas) antes del nombre que estamos buscando. En mi caso, no me preocupa que otros nombres se interpongan en el camino (es decir, nunca sería algo como :3:evnt:blahblahMISTER GREEN blah blah MISS SCARLET sin otro x:evnt en el medio)
Originalmente se me ocurrió:
(\d):evnt.*MISS SCARLET
que da "0" porque coincide con el índice de Mister Green, ya que .* coincide con todo. OK entonces ? al rescate:
(\d):evnt.*?MISS SCARLET
No, mismo resultado.
¿Cómo obtengo la coincidencia MÁS CERCANA al texto en cuestión? Estoy seguro de que no lo estoy redactando correctamente, pero el ejemplo debería mostrar lo que quiero. Quiero aislar ese "1" con MISS SCARLET y "0" si estuviera buscando a MISTER GREEN
Gracias.
Puede usar esta expresión regular con una clase de carácter negada:
(\d+):evnt:[^:]*:MISS SCARLET
Donde [^:]*
coincide con 0 o más de cualquier carácter que no sea :
.
Sin embargo, si existe la posibilidad de presencia de dos puntos después de la palabra clave evnt
, puede usar esta expresión regular con una anticipación negativa:
(\d+):evnt:(?:(?!:evnt:).)*?:MISTER GREEN
Aquí (?:(?!:evnt:).)*?
se asegurará de hacer coincidir 0 o más caracteres siempre que :evnt:
no aparezca en ningún lugar de ese texto.