62

我正在尝试将这From条线一直匹配到以下行的末尾Subject

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

到目前为止,我有:

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

但这与主题行的末尾不匹配。我尝试添加$,但没有效果。

4

5 回答 5

86

您可以使用/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并搜索“多行模式”和“默认贪婪”。

于 2011-03-09T00:36:23.640 回答
10

如果您使用的是 ruby​​,您可以尝试:

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

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

  1. 用 SOME_SPECIAL_TOKEN 替换所有“\n”
  2. 搜索正则表达式,并执行其他操作...
  3. 恢复:将 SOME_SPECIAL_TOKEN 替换为“\n”
于 2011-11-10T05:15:29.747 回答
5

如果要跨换行符进行匹配,一种可能性是首先将所有换行符替换为文本中不会出现的其他字符(或字符序列)。例如,如果您将所有文本都放在一个字符串变量中,您可以执行一些操作,例如aString.split("\n").join("|")用管道字符替换字符串中的所有换行符。

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

于 2011-03-09T00:29:38.390 回答
4

尝试:

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

于 2011-03-09T00:30:11.443 回答
1

使用以下数据:

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

以下正则表达式将发挥作用:

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

但我建议您不要尝试在 1 个正则表达式中执行此操作。逐行推入正则表达式 "^(\w+):(.+)$" ,除非您确定 FROM/DATE/TO/SUBJECT 的顺序不会改变;)

于 2011-03-09T00:32:48.360 回答