Подтвердить что ты не робот

Regex, как совместить несколько строк?

Я пытаюсь сопоставить строку From до конца строки Subject в следующем:

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

До сих пор я:

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

Но это не соответствует концу строки темы. Я попытался добавить $, но это не повлияло.

4b9b3361

Ответ 1

Вы можете использовать модификатор /m, чтобы включить многострочный режим (т.е. разрешить . соответствовать символам новой строки), и вы можете использовать ? для выполнения нежелательного соответствия:

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"

Смотрите http://ruby-doc.org/core/Regexp.html и найдите "многострочный режим" и "жадный по умолчанию".

Ответ 2

Если вы используете ruby, вы можете попробовать:

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

Если вы не используете ruby, я предлагаю вам взломать этот вопрос:

  • замените все "\n" на SOME_SPECIAL_TOKEN
  • искать регулярное выражение и выполнять другие операции...
  • restore: замените SOME_SPECIAL_TOKEN на "\n"

Ответ 3

Если вы хотите совпадение между строк, одна возможность состоит в том, чтобы сначала заменить все символы новой строки другим символом (или символьной последовательностью), которые иначе не появлялись бы в тексте. Например, если у вас есть весь текст в одной строковой переменной, вы можете сделать что-то вроде aString.split("\n").join("|"), чтобы заменить все строки новой строки в строке символами канала.

Также посмотрите ответ Алана Мура на предыдущий вопрос о том, как совместить символ новой строки в регулярном выражении.

Ответ 4


Try:

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

Ответ 5

Используя следующие данные:

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

Следующее regex будет делать магию:

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 не изменится;)