Регулярное выражение для соответствия любому символу, включая новые строки


224

Существует ли регулярное выражение для соответствия "всем символам, включая переводы строки"?

Например, в приведенном ниже регулярном выражении нет вывода из, $2потому (.+?)что не включает новые строки при сопоставлении.

$string = "START Curabitur mollis, dolor ut rutrum consequat, arcu nisl ultrices diam, adipiscing aliquam ipsum metus id velit. Aenean vestibulum gravida felis, quis bibendum nisl euismod ut. 

Nunc at orci sed quam pharetra congue. Nulla a justo vitae diam eleifend dictum. Maecenas egestas ipsum elementum dui sollicitudin tempus. Donec bibendum cursus nisi, vitae convallis ante ornare a. Curabitur libero lorem, semper sit amet cursus at, cursus id purus. Cras varius metus eu diam vulputate vel elementum mauris tempor. 

Morbi tristique interdum libero, eu pulvinar elit fringilla vel. Curabitur fringilla bibendum urna, ullamcorper placerat quam fermentum id. Nunc aliquam, nunc sit amet bibendum lacinia, magna massa auctor enim, nec dictum sapien eros in arcu. 

Pellentesque viverra ullamcorper lectus, a facilisis ipsum tempus et. Nulla mi enim, interdum at imperdiet eget, bibendum nec END";

$string =~ /(START)(.+?)(END)/;

print $2;

1
Вы можете прочитать о модификаторах / флагах регулярных выражений, таких как: m, s (m / regex / ims ...)
snoofkin

Ответы:


195

Добавьте sмодификатор к своему регулярному выражению, .чтобы он соответствовал символам новой строки:

$string =~ /(START)(.+?)(END)/s;

32
В JavaScript: (НАЧАЛО) [\ s \ S] * (КОНЕЦ) - См. Www.regexpal.com для проверки
Zymotik

1
Для получения дополнительной информации относительно комментария @ Zymotik см .: stackoverflow.com/questions/1068280/…
Джейкоб ван Линген

2
В Java вы можете использовать встроенный модификатор (? S) в начале регулярного выражения, например, чтобы заменить любой символ, включая символы новой строки, после использования yourPattern "(?s)yourPattern.*"- см. Также: rexegg.com/regex-modifiers.html#dotall
LukeSolar

В Ruby модификатор есть m, нет s. Смотрите: rubular.com
Джон Шнайдер

313

Если вы не хотите добавлять /sмодификатор regex (возможно, вы все еще хотите .сохранить его первоначальное значение в другом месте регулярного выражения), вы также можете использовать класс символов. Одна возможность:

[\S\s]

символ, который не является пробелом или пробелом. Другими словами, любой персонаж.

Вы также можете изменить модификаторы локально в небольшой части регулярного выражения, например так:

(?s:.)

2
+1 Я как раз собирался разобраться с (?s:.)синтаксисом сам.
BoltClock

Является ли (?:.|\n)уступать в любом случае, кроме как быть менее элегантным?
Властимил Овчачик

([\S\s]+)это то, что я искал. Спасибо. +1
Райан

@ VlastimilOvčáčík Это может быть очень плохо для времени выполнения, если вы используете его с *или, +так как есть 2 ^ n различных способов, которым он может соответствовать любой данной строке длины n.
Радон Росборо

8

Да, вам просто нужно сделать .совпадение новой строки:

$string =~ /(START)(.+?)(END)/s;

-5

Вы хотите использовать «многострочный».

$string =~ /(START)(.+?)(END)/m;

6
Нет, mвлияет на ^и $якоря, но нет ..
BoltClock

Интересно, спасибо. Думаю, я никогда не пытался делать именно то, о чем просит ОП.
Надим
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.