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;

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;

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:.)

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;

-5

Anda ingin menggunakan "multiline".

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

6
Tidak, mmempengaruhi ^dan $jangkar tetapi tidak ..
BoltClock

Menarik, terima kasih. Kira saya tidak pernah mencoba melakukan persis apa yang diminta OP.
nadime
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.