Регулярное выражение для соответствия любому символу, включая новые строки
Существует ли регулярное выражение для соответствия "всем символам, включая переводы строки"?
Например, в приведенном ниже регулярном выражении нет вывода из $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;
7 ответов
Добавить s
модификатор вашего регулярного выражения, чтобы вызвать .
соответствовать новым строкам:
$string =~ /(START)(.+?)(END)/s;
Если вы не хотите добавлять /s
модификатор regex (возможно, вы все еще хотите .
чтобы сохранить его первоначальное значение в другом месте регулярного выражения), вы также можете использовать класс символов. Одна возможность:
[\S\s]
символ, который не является пробелом или пробелом... другими словами, любой символ.
Вы также можете изменить модификаторы локально в небольшой части регулярного выражения, например, так:
(?s:.)
Это очень удобочитаемо для меня и соответствует " любому символу или новой строке "
(.|\n)*
Он ведет себя так же, как
[\S\s]*
и так же, как
(?s:.)*
Да, вам просто нужно сделать .
соответствовать новой строке:
$string =~ /(START)(.+?)(END)/s;
Мне нравится использовать пустой отрицательный набор, который соответствует любому символу, не входящему в группу, поскольку он пуст, он будет соответствовать всему, включая символы новой строки.
[^]
Если вам нужно больше нуля символов
[^]*
Или более одного
[^]+
Протестировано на JavaScript.
Следуйте другим ответам, в которых используется флаг, позволяющий.
соответствовать каждому символу в
В Perl v5.12 добавлен ярлык класса символов, который всегда соответствует любому символу, кроме символа новой строки, несмотря на настройку/s
. Это позволяет\n
иметь такого партнера, как\s
имеет\S
.
При этом вы можете делать похожие ответы, используя обе стороны дополнения:[\n\N]
,[\s\S]
, и так далее.
Однако вы также пометили это с помощью javascript, который думает\N
это просто заглавная Н.
Вы хотите использовать "многострочный".
$string =~ /(START)(.+?)(END)/m;