Saya menulis regex untuk mengambil string dari HTML, tetapi tampaknya bendera multiline tidak berfungsi.
Ini adalah pola saya dan saya ingin mendapatkan teks dalam h1
tag.
var pattern= /<div class="box-content-5">.*<h1>([^<]+?)<\/h1>/mi
m = html.search(pattern);
return m[1];
Saya membuat string untuk mengujinya. Ketika string berisi "\ n", hasilnya selalu nol. Jika saya menghapus semua "\ n", itu memberi saya hasil yang tepat, tidak masalah dengan atau tanpa /m
bendera.
Apa yang salah dengan regex saya?
javascript
regex
Peter Mortensen
sumber
sumber
dotAll
pengubah sehingga Anda dapat melakukan/.../s
dan titik-titik Anda juga akan cocok baris baru. Pada Juli 2017 berada di belakang bendera di Chrome.Jawaban:
Anda mencari
/.../s
pengubah, juga dikenal sebagai pengubah dotall . Ini memaksa titik.
untuk juga cocok dengan baris baru, yang tidak dilakukan secara default.Berita buruknya adalah ia
tidak ada di JavaScript(tidak seperti pada ES2018, lihat di bawah) . Berita baiknya adalah Anda dapat mengatasinya dengan menggunakan kelas karakter (mis.\s
) Dan negasi (\S
) bersama-sama, seperti ini:Jadi dalam kasus Anda regex akan menjadi:
Pada ES2018, JavaScript mendukung
s
flag (dotAll), jadi di lingkungan modern ekspresi reguler Anda bisa seperti saat Anda menulisnya, tetapi dengans
flag di bagian akhir (alih-alihm
;m
mengubah cara^
dan$
kerja, tidak.
):sumber
.
, tetapi mencocokkan spasi putih juga (\s
) berarti cocok\n
(yang.
tidak dilakukan dalam JavaScript, atau dapat dilakukan dengans
bendera).[^]
juga berfungsi untuk mencocokkan karakter apa pun, termasuk baris baru, dalam JavaScript. Lihat developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…*?
quantifier alih-alih*
untuk menghindari keserakahan. Ini akan menghindari penangkapan terakhir <h1> dokumen: itu mungkin bukan apa yang Anda inginkan dan itu tidak efisien karena regexp akan terus mencari <h1> sampai akhir string bahkan jika itu telah ditemukan sebelumnya.Anda menginginkan
s
pengubah (dotall), yang tampaknya tidak ada dalam Javascript - Anda dapat menggantinya.
dengan [\ s \ S] seperti yang disarankan oleh @molf. Them
(multiline) merek pengubah ^ dan $ jalur pertandingan daripada seluruh string.sumber
s
bendera (ES2018). :-)[\s\S]
tidak bekerja untuk saya di nodejs 6.11.3. Berdasarkan dokumentasi RegExp , dikatakan menggunakan[^]
yang berfungsi untuk saya.Sebagai contoh:
/This is on line 1[^]*?This is on line 3/m
Dimana *? adalah ambil tanpa-serakah dari 0 atau lebih kejadian [^].
sumber
[^]
artinya: itu seperti negasi ganda: "cocokkan karakter apa pun yang tidak ada dalam daftar kosong ini " dan karenanya dikatakan "cocokkan karakter apa pun" .Pengubah dotall sebenarnya telah membuatnya menjadi JavaScript pada Juni 2018, yaitu ECMAScript 2018.
https://github.com/tc39/proposal-regexp-dotall-flag
sumber
Saran saya adalah bahwa lebih baik untuk memisahkan string multi-line dengan "\ n" dan menggabungkan pemisahan dari string asli dan menjadi satu baris dan mudah untuk dimanipulasi.
sumber