Регулярное выражение, как сопоставить несколько строк?
Я пытаюсь соответствовать From
линия до самого конца Subject
строка в следующем:
....
From: XXXXXX
Date: Tue, 8 Mar 2011 10:52:42 -0800
To: XXXXXXX
Subject: XXXXXXX
....
пока у меня есть:
/From:.*Date:.*To:.*Subject/m
но это не конец сюжетной линии. Я попробовал добавить $
но это не имело эффекта.
5 ответов:
можно использовать
/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 и поиск "многострочный режим"и" жадный по умолчанию".
Если вы используете ruby, вы можете попробовать:
Regexp.new("some reg", Regexp::MULTILINE)
Если вы не используете ruby, я предлагаю вам взломать этот вопрос:
- замените все "\n " на SOME_SPECIAL_TOKEN
- поиск регулярного выражения и выполнение других операций...
- восстановить: заменить SOME_SPECIAL_TOKEN на "\n"
Если вы хотите сопоставить все разрывы строк, одна из возможностей заключается в том, чтобы сначала заменить все символы новой строки каким-либо другим символом (или последовательностью символов), которые в противном случае не появлялись бы в тексте. Например, если у вас есть весь текст в одной строковой переменной, вы можете сделать что-то вроде
aString.split("\n").join("|")
чтобы заменить все новые строки в строке с символами канала.кроме того, посмотрите на ответ Алана Мура к вашему предыдущему вопросу о том, как соответствовать новой строке символ в регулярном выражении.
используя следующие данные:
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+): (.+ ) $ "строка за строкой, если вы не уверены, что последовательность от / дата / до / тема не изменится ;)