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

118

Есть ли регулярное выражение для соответствия "всем символам, включая символы новой строки"?

Например, в приведенном ниже выражении нет результата из $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 ...)
Теги:

4 ответа

109
Лучший ответ

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

$string =~ /(START)(.+?)(END)/s;
  • 27
    В JavaScript: (НАЧАЛО) [\ s \ S] * (КОНЕЦ) - см. Www.regexpal.com для проверки
  • 1
    Для получения дополнительной информации относительно комментария @ Zymotik см. Stackoverflow.com/questions/1068280/…
174

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

[\S\s]

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

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

(?s:.)
  • 2
    +1 Я как раз собирался смириться с (?s:.) синтаксисом сам.
  • 7
    +1 за новинку. \d\D , \w\W тоже работают. знак равно
Показать ещё 4 комментария
5

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

$string =~ /(START)(.+?)(END)/s;
  • 5
    +1 за опоздание на 16 секунд. знак равно
  • 0
    @ TLP LOL Спасибо :)
-2

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

$string =~ /(START)(.+?)(END)/m;
  • 6
    Нет, m влияет на якоря ^ и $ но не влияет . ,
  • 0
    Интересно, спасибо. Думаю, я никогда не пытался делать именно то, о чем спрашивает ОП.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню