Regex para corresponder a qualquer caractere, incluindo novas linhas


223

Existe uma regex para corresponder a "todos os caracteres, incluindo novas linhas"?

Por exemplo, no regex abaixo, não há saída $2porque (.+?)não inclui novas linhas ao fazer a correspondência.

$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
Você pode querer ler sobre modificadores regex / bandeiras, tais como: M, S (m / regex / IMS ...)
snoofkin

Respostas:


194

Adicione o smodificador ao seu regex para fazer .corresponder as novas linhas:

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

32
Em JavaScript: (START) [\ s \ S] * (END) - consulte www.regexpal.com para testar
Zymotik

1
Para mais informações a respeito @ comentário de Zymotik, consulte: stackoverflow.com/questions/1068280/...
Jacob van Lingen

2
Em Java, você pode usar os modificadores em linha no início do regex, por exemplo, para substituir qualquer caractere, incluindo novas linhas após o uso de 'yourPattern' "(?s)yourPattern.*"- Consulte também: rexegg.com/regex-modifiers.html#dotall
LukeSolar

No Ruby, o modificador mnão é s. Veja: rubular.com
Jon Schneider

312

Se você não quiser adicionar o /smodificador regex (talvez ainda deseje .manter seu significado original em outro local do regex), também poderá usar uma classe de caractere. Uma possibilidade:

[\S\s]

um personagem que não é um espaço ou é um espaço. Em outras palavras, qualquer personagem.

Você também pode alterar modificadores localmente em uma pequena parte do regex, da seguinte maneira:

(?s:.)

2
+1 Eu estava prestes a usar a (?s:.)sintaxe.
BoltClock

É (?:.|\n)inferior de alguma forma, exceto ser menos elegante?
Vlastimil Ovčáčík 01/03

([\S\s]+)é o que eu estava procurando. Obrigado. +1
Ryan

@ VlastimilOvčáčík Essa pode ser muito ruim para o tempo de execução se você a usar com *ou +uma vez que existem 2 ^ n maneiras diferentes de corresponder a qualquer sequência de comprimento n.
Radon Rosborough 24/04/19

8

Sim, você só precisa criar uma .nova linha de correspondência:

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

-5

Você deseja usar "multilinha".

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

6
Não, mafeta as âncoras ^e, $mas não ..
BoltClock

Interessante, obrigado. Acho que nunca tentei fazer exatamente o que o OP está pedindo.
Nadime
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.