Regex, как сопоставить несколько строк? - PullRequest
55 голосов
/ 09 марта 2011

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

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

Пока у меня есть:

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

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

Ответы [ 5 ]

76 голосов
/ 09 марта 2011

Вы можете использовать модификатор /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 и выполните поиск «многострочный режим» и «жадность по умолчанию».

9 голосов
/ 10 ноября 2011

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

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

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

  1. заменить все "\n "с помощью SOME_SPECIAL_TOKEN
  2. поиск по регулярному выражению и выполнение других операций ...
  3. восстановление: замените SOME_SPECIAL_TOKEN на" \ n "
5 голосов
/ 09 марта 2011

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

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

4 голосов
/ 09 марта 2011

Попробуйте:

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

1 голос
/ 09 марта 2011

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

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

...