Regex, comment faire correspondre plusieurs lignes?

J’essaie de faire correspondre la ligne From jusqu’à la fin de la ligne Subject dans les éléments suivants:

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

Jusqu’à présent j’ai:

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

Mais cela ne correspond pas à la fin de la ligne d’object. J’ai essayé d’append $ mais cela n’a eu aucun effet.

Vous pouvez utiliser le modificateur /m pour activer le mode multiligne (c.-à-d . Autoriser . faire correspondre les nouvelles lignes), et vous pouvez utiliser ? effectuer une correspondance non gourmande:

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

Voir http://ruby-doc.org/core/Regexp.html et recherchez “mode multiligne” et “gourmand par défaut”.

Si vous utilisez Ruby, vous pouvez essayer:

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

Si vous n’utilisez pas Ruby, je vous suggère de pirater cette question:

  1. remplacer tous les “\ n” par SOME_SPECIAL_TOKEN
  2. recherche dans l’expression rationnelle et effectue d’autres opérations …
  3. restore: remplacez SOME_SPECIAL_TOKEN par “\ n”

Si vous souhaitez faire correspondre les sauts de ligne, vous pouvez d’abord remplacer tous les caractères de nouvelle ligne par un autre caractère (ou une séquence de caractères) qui n’apparaîtrait pas autrement dans le texte. Par exemple, si vous avez tout le texte d’une variable de chaîne, vous pouvez faire quelque chose comme aSsortingng.split("\n").join("|") pour remplacer toutes les nouvelles lignes de la chaîne par des caractères de chaîne.

Aussi, regardez la réponse d’Alan Moore à votre question précédente concernant la manière de faire correspondre le caractère de nouvelle ligne dans une expression régulière.


Essayer:

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

En utilisant les données suivantes:

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

La regex suivante fera la magie:

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

Mais je vous recommande de ne pas essayer de le faire en 1 regex. Poussez dans une expression régulière “^ (\ w +): (. +) $” Ligne par ligne, sauf si vous êtes sûr que la séquence FROM / DATE / TO / SUBJECT ne va pas changer;)