Mi expresión regular coincide demasiado. ¿Cómo hago para que se detenga? [duplicar]
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 Name
hasta 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}
?
Haga que .*
no sea codicioso agregando ' ?
' después:
Project name:\s+(.*?)\s+J[0-9]{7}:
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}:
\S
significa "todo excepto un espacio en blanco y esto es exactamente lo que quieres".
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é. s
contiene 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;