55 votes

Regex, comment faire correspondre plusieurs lignes ?

J'essaie de faire correspondre la ligne FROM jusqu'à la ligne Subject dans le document suivant :

....
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'objet. J'ai essayé d'ajouter $ mais cela n'a pas eu d'effet. Des idées ?

78voto

Pan Thomakos Points 19946

Vous pouvez utiliser le commutateur /m pour permettre à . de correspondre aux nouvelles lignes et vous pouvez utiliser ? pour effectuer une correspondance non avide :

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"

9voto

Siwei Shen Points 5814

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 "avec SOME_SPECIAL_TOKEN
  2. rechercher le regexp, et faire d'autres opérations...
  3. restauration : remplacer SOME_SPECIAL_TOKEN par " \n "

5voto

bta Points 22525

Si vous souhaitez établir une correspondance entre 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 dans le texte. Par exemple, si tout le texte se trouve dans une variable de type chaîne, vous pouvez procéder comme suit aString.split("\n").join("|") pour remplacer toutes les nouvelles lignes de la chaîne par des caractères de type pipe.

Regardez aussi 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.

4voto

DigitalRoss Points 80400

Essayez :

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

1voto

PrashantGupta Points 820

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 faire cela en une seule regex. Poussez dans une regex "^( \w +) :(.+)$" ligne par ligne, à moins que vous ne soyez sûr que la séquence du FROM/DATE/TO/SUBJECT ne va pas changer ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X