2008-08-22 12 views
37
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 J0000100: Machine name: DEV J0000100: Project file: E:\mbiek\foo.pf J0000100: Template file: E:\mbiek\foot.xdt J0000100: Job name: MBiek J0000100: Output folder: E:\foo\A0001401 J0000100: Temp folder: E:\foo\Output\A0001401 J0000100: Document 1 - Starting document J0005000: Document 1 - Text overflowed on page 1 (warning) J0000101: Document 1 - 1 page(s) composed J0000102: Document 1 - 1 page(s) rendered at 500 x 647 pixels J0000100: Document 1 - Completed successfully J0000020: 

Tengo esta cadena fea gigante y estoy tratando de extraer piezas de ella utilizando expresiones regulares.Mi expresión regular coincide demasiado. ¿Cómo lo hago parar?

En este caso, quiero agarrar todo después de "Nombre del proyecto" hasta la parte donde dice "J0000011:" (el 11 va a ser un número diferente cada vez).

Aquí es la expresión regular que he estado jugando con

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

El problema es que no se detiene hasta que llega a la J0000020 : al final.

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

+0

@Jav_Rock: Al reformatear los datos, ha cambiado la pregunta. La expresión regular original de OP funciona como se desea ahora porque '.' no coincide con las líneas nuevas que ha agregado. –

+0

lo siento, retrocedo –

Respuesta

51

Hacer .* no expansivo añadiendo '?' después de que:

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

El uso de cuantificadores no codiciosos aquí es probablemente la mejor solución, también porque es más eficiente que la alternativa codiciosos: partidos Greedy general ir lo más lejos que puedan (¡aquí, hasta el final del texto!) y luego rastrear carácter tras carácter para intentar hacer coincidir la parte que viene después.

Hower, considere el uso de una clase de caracteres negativos en su lugar:

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

\S significa “todo menos un espacio en blanco y esto es exactamente lo que quiere.

0

También recomendaría que experimente con expresiones regulares usando "Expresso" - es una herramienta de gran utilidad (y gratuita) para la edición y prueba de expresiones regulares.

Una de sus ventajas es que su interfaz de usuario expone una gran cantidad de funciones de expresiones regulares que las personas inexpertas con expresiones regulares podrían no estar familiarizadas, de forma que les resultaría fácil aprender estos nuevos conceptos.

Por ejemplo, cuando construye su expresión regular usando la interfaz de usuario, y seleccionando "*", tiene la capacidad de marcar la casilla "Lo mínimo posible" y ver la expresión regular resultante, así como probar su comportamiento, incluso si no estabas familiarizado con expresiones no codiciosas antes.

disponible para su descarga en su sitio: http://www.ultrapico.com/Expresso.htm

descarga Express: http://www.ultrapico.com/ExpressoDownload.htm

2

Bueno, ".*" es un selector codicioso. Lo haces no codicioso usando ".*?" Al usar este último constructo, el motor de expresiones regulares, en cada paso, hará coincidir el texto en el intento "." para hacer coincidir lo que sea que venga después del ".*?". Esto significa que si, por ejemplo, nada viene después del ".*?", entonces no coincide con nada.

Esto es lo que he usado. s contiene su cadena original. Este código es .NET específico, pero la mayoría de los sabores de expresiones regulares tendrán algo similar.

string m = Regex.Match(s, @"Project name: (?<name>.*?) J\d+").Groups["name"].Value; 
Cuestiones relacionadas