Regex, как сопоставить несколько строк?
Я пытаюсь соответствовать 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+):(.+)$" Построчно, если только вы не уверены, что последовательность FROM/DATE/TO/SUBJECT не изменится;)