正则expression式,如何匹配多行?

我试图将From行一直匹配到以下Subject行的末尾:

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

到目前为止我有:

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

但是,这不符合主题行的结尾。 我尝试添加$但没有效果。

您可以使用/m修饰符启用多行模式(即允许匹配换行符),您可以使用? 执行非贪婪匹配:

 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" 

请参阅http://ruby-doc.org/core/Regexp.html并search“多行模式”和“默认贪婪”。;

如果你使用ruby,你可以尝试:

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

如果你不使用ruby,我build议你破解这个问题:

  1. 用SOME_SPECIAL_TOKENreplace所有的“\ n”
  2. search正则expression式,并执行其他操作…
  3. 恢复:用“\ n”replaceSOME_SPECIAL_TOKEN

如果要在换行符之间进行匹配,则有一种可能性是先将所有换行符replace为不会出现在文本中的其他字符(或字符序列)。 例如,如果将所有文本都放在一个stringvariables中,则可以使用aString.split("\n").join("|")来replacestring中的所有换行符。

另外,请看Alan Moore对你之前关于如何在正则expression式中匹配换行符的问题的回答 。


尝试:

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

使用以下数据:

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

下面的正则expression式将做到这一点:

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

但我会build议你不要尝试在1个正则expression式中执行此操作。 除非您确定FROM / DATE / TO / SUBJECT的顺序不会改变,否则请逐行插入正则expression式“^(\ w +):(。+)$”