Regex відповідає будь-якому символу, включаючи нові рядки


223

Чи є регулярний вираз, який відповідає "усім символам, включаючи нові рядки"?

Наприклад, у регулярному вираженні нижче немає результату, $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

Відповіді:


194

Додайте sмодифікатор до свого регулярного виразу, щоб .він відповідав новим рядкам:

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

32
У JavaScript: (START) [\ s \ S] * (END) - Перевірте www.regexpal.com для тестування
Zymotik

1
Для отримання додаткової інформації стосовно коментаря @ Zymotik дивіться: stackoverflow.com/questions/1068280/…
Jacob van Lingen

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

У Ruby модифікатором є m, ні s. Дивіться: rubular.com
Джон Шнайдер

312

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

[\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

Цікаво, дякую. Гадаю, я ніколи не намагався робити саме те, що просить ОП.
nadime
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.