Mi expresión regular coincide demasiado. ¿Cómo hago para que se detenga? [duplicar]

Resuelto Mark Biek asked hace 16 años • 4 respuestas

Tengo esta cuerda gigantesca y fea:

J0000000: Transaction A0001401 started on 8/22/2008 9:49:29 AM
J0000010: Project name: E:\foo.pf
J0000011: Job name: MBiek Direct Mail Test
J0000020: Document 1 - Completed successfully

Estoy tratando de extraer piezas usando expresiones regulares. En este caso, quiero tomar todo después Project Namehasta la parte donde dice J0000011:(el 11 será un número diferente cada vez).

Aquí está la expresión regular con la que he estado jugando:

Project name:\s+(.*)\s+J[0-9]{7}:

El problema es que no se detiene hasta llegar al J0000020: al final.

¿Cómo hago para que la expresión regular se detenga ante la primera aparición de J[0-9]{7}?

Mark Biek avatar Aug 22 '08 21:08 Mark Biek
Aceptado

Haga que .*no sea codicioso agregando ' ?' después:

Project name:\s+(.*?)\s+J[0-9]{7}:
jj33 avatar Aug 22 '2008 14:08 jj33

Usar cuantificadores no codiciosos aquí es probablemente la mejor solución, también porque es más eficiente que la alternativa codiciosa: las coincidencias codiciosas generalmente llegan tan lejos como pueden (¡aquí, hasta el final del texto!) y luego rastrean carácter tras carácter. para intentar igualar la pieza que viene después.

Sin embargo, considere usar una clase de carácter negativo en su lugar:

Project name:\s+(\S*)\s+J[0-9]{7}:

\Ssignifica "todo excepto un espacio en blanco y esto es exactamente lo que quieres".

Konrad Rudolph avatar Aug 22 '2008 14:08 Konrad Rudolph

Bueno, ".*"es un selector codicioso. Lo haces no codicioso usando ".*?"Al usar la última construcción, el motor de expresiones regulares, en cada paso, hará coincidir el texto en el "."intento de hacer coincidir lo que venga después del ".*?". Esto significa que si, por ejemplo, no hay nada después de ".*?", entonces no coincide con nada.

Esto es lo que usé. scontiene su cadena original. Este código es específico de .NET, pero la mayoría de las versiones de expresiones regulares tendrán algo similar.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value;
Svend avatar Aug 22 '2008 14:08 Svend