web-dev-qa-db-fra.com

Regex, comment faire correspondre plusieurs lignes?

J'essaie de faire correspondre la ligne From jusqu'à la fin de la ligne Subject comme suit:

....
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 eu aucun effet.

55
AnApprentice

Vous pouvez utiliser le /m modificateur pour activer le mode multiligne (c'est-à-dire pour autoriser . pour faire correspondre les sauts de ligne) et vous pouvez utiliser ? pour 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".

76
Pan Thomakos

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. rechercher l'expression rationnelle et effectuer d'autres opérations ...
  3. restauration: remplacez SOME_SPECIAL_TOKEN par "\ n"
9

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

Regardez également réponse d'Alan Moore à votre question précédente sur la façon de faire correspondre le caractère de nouvelle ligne dans une expression régulière.

5
bta

Essayer:

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

4
DigitalRoss

En utilisant les données suivantes:

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

Le regex suivant 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 de FROM/DATE/TO/SUBJECT ne va pas changer;)

1
chkdsk