var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre.*?<\/pre>/gm );
alert(arr); // null
Saya ingin blok PRE diambil, meskipun itu mencakup karakter baris baru. Saya pikir bendera 'm' melakukannya. Tidak.
Temukan jawabannya di sini sebelum memposting. Karena saya pikir saya tahu JavaScript (baca tiga buku, jam kerja) dan tidak ada solusi di SO, saya akan berani memposting. lempar batu di sini
Jadi solusinya adalah:
var ss= "<pre>aaaa\nbbb\nccc</pre>ddd";
var arr= ss.match( /<pre[\s\S]*?<\/pre>/gm );
alert(arr); // <pre>...</pre> :)
Adakah yang memiliki cara yang kurang samar?
Sunting: ini duplikat tetapi karena lebih sulit ditemukan daripada milik saya, saya tidak menghapus.
Ini mengusulkan [^]
sebagai "titik multiline". Apa yang masih saya tidak mengerti adalah mengapa [.\n]
tidak berhasil. Kira ini adalah salah satu bagian sedih dari JavaScript ..
javascript
regex
aliasuppi
sumber
sumber
Jawaban:
[.\n]
tidak berfungsi karena.
tidak memiliki makna khusus di dalamnya[]
, itu hanya berarti literal.
.(.|\n)
akan menjadi cara untuk menentukan "karakter apa pun, termasuk baris baru". Jika Anda ingin mencocokkan semua baris, Anda akan perlu menambahkan\r
juga untuk menyertakan Windows dan Mac OS klasik akhir baris gaya:(.|[\r\n])
.Itu ternyata agak rumit, juga lambat, (lihat jawaban KrisWebDev untuk detailnya ), jadi pendekatan yang lebih baik adalah mencocokkan semua karakter spasi putih dan semua karakter non-spasi putih, dengan
[\s\S]
, yang akan cocok dengan semuanya, dan lebih cepat dan lebih lebih sederhana.Secara umum, Anda tidak harus mencoba menggunakan regexp untuk mencocokkan tag HTML yang sebenarnya. Lihat, misalnya, pertanyaan - pertanyaan ini untuk informasi lebih lanjut tentang alasannya.
Alih-alih, cobalah mencari DOM untuk tag yang Anda butuhkan (menggunakan jQuery membuat ini lebih mudah, tetapi Anda selalu dapat melakukannya
document.getElementsByTagName("pre")
dengan DOM standar), lalu mencari konten teks dari hasil tersebut dengan regexp jika Anda perlu mencocokkan dengan konten .sumber
[\r\n]
diterapkan pada urutan \ r \ n, pertama-tama akan cocok dengan \ r dan kemudian \ n. Jika Anda ingin mencocokkan seluruh urutan sekaligus, terlepas dari apakah urutan itu \ r \ n atau hanya \ n, gunakan pola.|\r?\n
[\s\S]+
..
dalam[]
adalah berbeda dari kerangka kerja regex lain, khususnya yang maju di NET. Teman-teman, tolong jangan berasumsi bahwa regex adalah lintas platform, mereka sering tidak !!JANGAN gunakan
(.|[\r\n])
bukan.
untuk pencocokan multiline.LAKUKAN gunakan
[\s\S]
alih-alih.
untuk pencocokan multilineJuga, hindari keserakahan di mana tidak diperlukan dengan menggunakan
*?
atau+?
mengukur bukan*
atau+
. Ini dapat memiliki dampak kinerja yang sangat besar.Lihat patokan yang telah saya buat: http://jsperf.com/javascript-multiline-regexp-workarounds
NB: Anda juga dapat menggunakan
[^]
tetapi sudah usang dalam komentar di bawah ini.sumber
[^]
. Di satu sisi, JavaScript adalah satu-satunya rasa yang saya tahu yang mendukung idiom itu, dan bahkan ada yang digunakan di tempat dekat sesering[\s\S]
. Di sisi lain, sebagian besar citarasa lain memungkinkan Anda melarikan diri]
dengan mendaftar terlebih dahulu. Dengan kata lain, dalam JavaScript[^][^]
cocok dengan dua karakter, tapi di NET itu cocok dengan salah satu karakter selain]
,[
atau^
.\S
akan cocok\r
atau\n
berlawanan dengan beberapa karakter lain?[\s\S]
orang lain, seperti[\d\D]
atau[\w\W]
?/<p>Can[^]*?<\/p>/
tidak cocok dengan konten yang sama dengan/<p>Can[^]*<\/p>/
. Varian serakah harus diubah/<p>(?:[^<]|<(?!\/p>))*<\/p>/
agar sesuai dengan konten yang sama.Anda tidak menentukan lingkungan dan versi Javascript (ECMAscript) Anda, dan saya menyadari bahwa postingan ini berasal dari 2009, tetapi hanya untuk kelengkapan, dengan rilis ECMA2018 sekarang kita dapat menggunakan
s
bendera yang menyebabkan.
kecocokan '\ n', lihat https : //stackoverflow.com/a/36006948/141801Jadi:
Ini adalah tambahan baru-baru ini dan tidak akan berfungsi di banyak lingkungan saat ini, misalnya Node v8.7.0 tampaknya tidak mengenalinya, tetapi bekerja di Chromium, dan saya menggunakannya dalam uji tulis naskah yang saya tulis dan mungkin itu akan menjadi lebih utama seiring berjalannya waktu.
sumber
[.\n]
tidak berfungsi, karena titik dalam[]
(menurut definisi regex; bukan hanya javascript) berarti karakter titik. Anda dapat menggunakan(.|\n)
(atau(.|[\n\r])
) sebagai gantinya.sumber
[\s\S]
adalah idiom JavaScript paling umum untuk mencocokkan semuanya termasuk baris baru. Ini lebih mudah pada mata dan jauh lebih efisien daripada pendekatan berbasis alternatif seperti(.|\n)
. (Secara harfiah berarti "setiap karakter yang merupakan spasi putih atau karakter apa pun yang bukan spasi putih)..
dan\n
, dan mengapa[.\n]
tidak berhasil. Seperti disebutkan dalam pertanyaan, pendekatan[^]
ini juga bagus.Saya telah mengujinya (Chrome) dan itu berfungsi untuk saya (keduanya
[^]
dan[^\0]
), dengan mengubah titik (.
) dengan salah satu[^\0]
atau[^]
, karena titik tidak cocok dengan jeda baris (Lihat di sini:http://www.regular-expressions.info/dot.html ).sumber
[^\0]
adalah bahwa itu tidak akan cocok dengan karakter nol meskipun karakter nol diizinkan dalam string Javascript (lihat jawaban ini ).Selain contoh-contoh di atas, ini merupakan alternatif.
Di mana
\w
untuk kata-kata dan\s
untuk ruang putihsumber