Regex untuk mencocokkan karakter apa pun termasuk baris baru

223

Apakah ada regex yang cocok dengan "semua karakter termasuk baris baru"?

Misalnya, dalam regex di bawah ini, tidak ada output dari $2karena (.+?)tidak termasuk baris baru saat pencocokan.

$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;
kurotsuki
sumber
1
Anda mungkin ingin membaca tentang pengubah / bendera regex seperti: m, s (m / regex / ims ...)
snoofkin

Jawaban:

194

Tambahkan spengubah ke regex Anda .agar sesuai dengan baris baru:

$string =~ /(START)(.+?)(END)/s;
BoltClock
sumber
32
Dalam JavaScript: (MULAI) [\ s \ S] * (SELESAI) - Lihat www.regexpal.com untuk menguji
Zymotik
1
Untuk info lebih lanjut mengenai komentar @ Zymotik, lihat: stackoverflow.com/questions/1068280/…
Jacob van Lingen
2
Di Jawa Anda dapat menggunakan pengubah sebaris (? S) di awal regex, misalnya untuk mengganti karakter apa pun termasuk baris baru setelah penggunaan 'yourPattern' "(?s)yourPattern.*"- Juga lihat: rexegg.com/regex-modifiers.html#dotall
LukeSolar
Di Ruby, pengubahnya mbukan s. Lihat: rubular.com
Jon Schneider
312

Jika Anda tidak ingin menambahkan /spengubah regex (mungkin Anda masih ingin .mempertahankan makna aslinya di tempat lain di regex), Anda juga dapat menggunakan kelas karakter. Satu kemungkinan:

[\S\s]

karakter yang bukan spasi atau ruang. Dengan kata lain, karakter apa saja.

Anda juga dapat mengubah pengubah secara lokal di sebagian kecil dari regex, seperti:

(?s:.)
singkat
sumber
2
1 Saya baru saja akan ikut campur dengan (?s:.)sintaks sendiri.
BoltClock
Apakah (?:.|\n)inferior dalam hal apa pun, kecuali kurang elegan?
Vlastimil Ovčáčík
([\S\s]+)adalah apa yang saya cari. Terima kasih. +1
Ryan
@ VlastimilOvčáčík Yang itu bisa sangat buruk untuk runtime jika Anda menggunakannya dengan *atau +karena ada 2 ^ n cara yang berbeda dapat cocok dengan string panjang tertentu n.
Radon Rosborough
8

Ya, Anda hanya perlu membuat .baris baru yang cocok:

$string =~ /(START)(.+?)(END)/s;
FailedDev
sumber
-5

Anda ingin menggunakan "multiline".

$string =~ /(START)(.+?)(END)/m;
nadime
sumber
6
Tidak, mmempengaruhi ^dan $jangkar tetapi tidak ..
BoltClock
Menarik, terima kasih. Kira saya tidak pernah mencoba melakukan persis apa yang diminta OP.
nadime