Regex, ¿cómo hacer coincidir múltiples líneas?

Estoy intentando hacer coincidir la línea From hasta el final de la línea de Subject en lo siguiente:

 .... From: XXXXXX Date: Tue, 8 Mar 2011 10:52:42 -0800 To: XXXXXXX Subject: XXXXXXX .... 

Hasta ahora tengo:

 /From:.*Date:.*To:.*Subject/m 

Pero eso no coincide con el final de la línea de asunto. Intenté agregar $ pero eso no tuvo efecto.

Puede usar el modificador /m para habilitar el modo multilínea (es decir, para permitir que coincida con las nuevas líneas), y puede usar ? para realizar el emparejamiento no codicioso:

 message = <<-MSG Random Line 1 Random Line 2 From: person@example.com Date: 01-01-2011 To: friend@example.com Subject: This is the subject line Random Line 3 Random Line 4 MSG message.match(/(From:.*Subject.*?)\n/m)[1] => "From: person@example.com\nDate: 01-01-2011\nTo: friend@example.com\nSubject: This is the subject line" 

Consulte http://ruby-doc.org/core/Regexp.html y busque “modo multilínea” y “codicioso por defecto”.

Si estás usando Ruby, puedes probar:

 Regexp.new("some reg", Regexp::MULTILINE) 

Si no estás usando ruby, te sugiero que trates esta pregunta:

  1. Reemplaza todos los “\ n” con SOME_SPECIAL_TOKEN
  2. buscar la expresión regular, y hacer otras operaciones …
  3. restaurar: reemplace SOME_SPECIAL_TOKEN con “\ n”

Si desea hacer coincidencias entre los saltos de línea, una posibilidad es reemplazar primero todos los caracteres de nueva línea con algún otro carácter (o secuencia de caracteres) que de otro modo no aparecería en el texto. Por ejemplo, si tiene todo el texto en una variable de cadena, puede hacer algo como aString.split("\n").join("|") para reemplazar todas las nuevas líneas en la cadena con caracteres de canalización.

Además, observe la respuesta de Alan Moore a su pregunta anterior sobre cómo hacer coincidir el carácter de nueva línea en una expresión regular.


Tratar:

 /...^Subject:[^\n]*/m 

Utilizando los siguientes datos:

 From: XXXXXX Date: Tue, 8 Mar 2011 10:52:42 -0800 To: XXXXXXX Subject: XXXXXXX 

El siguiente regex hará la magia:

 From:([^\r\n]+)[\r\n]+Date:([^\r\n]+)[\r\n]+To:([^\r\n]+)[\r\n]+Subject:([^\r\n]+)[\r\n]+ 

Pero recomendaría que no intente hacer esto en 1 expresión regular. Empuje en una expresión regular “^ (\ w +): (. +) $” Línea por línea, a menos que esté seguro de que la secuencia de FROM / DATE / TO / SUBJECT no cambiará;)