Sublime Text regex tidak mendeteksi tag multiline

130

Saya punya regex ini di sini;

\[sometag\](.*)\[/sometag\]

Yang seharusnya menangkap teks yang dikelilingi oleh [sometag]tag. Ini berfungsi untuk informasi satu baris yang terkandung dalam tag ini, seperti pada string [sometag]this is a bit of text[/sometag]. Tapi itu tidak berfungsi pada teks yang membentang beberapa baris, seperti ini;

[sometag] here is more text

it spans more than one line [/sometag]

Untuk beberapa alasan, pencari regex teks Sublime tidak akan mengenali tag di beberapa baris. Saya ingin tahu apakah ini masalah dengan Sublime Text, opsi yang dapat diubah, atau hanya ketidakmampuan pribadi saya dengan regex.

Maurdekye
sumber

Jawaban:

240

Pada awalnya, gunakan pengubah dotall (?s)untuk membuat dot agar cocok dengan karakter baris baru.

(?s)\[sometag\](.*?)\[\/sometag\]

DEMO

Avinash Raj
sumber
Terima kasih! Mengapa saya harus memasukkan tanda tanya ekstra itu?
Maurdekye
8
?setelah *akan melakukan pertandingan non-serakah. Pertimbangkan [b]foo[/b]foo[b]bar[/b]sebagai contoh. \[b\].*\[\/b\]akan mencocokkan keseluruhan dari awal b hingga penutupan terakhir b.
Avinash Raj
mainkan saja dengan menambahkan dan menghapusnya ?di regex101.com/r/gI0xC3/2
Avinash Raj
11
(? s) menyebabkan titik juga menyertakan baris baru
cmroanirgo
3
tanda tanya setelah tanda bintang penting karena mendefinisikan pertandingan sebagai tidak serakah.
andrej
12

Jika memodifikasi mode dot tidak dapat diterima karena beberapa alasan, Anda dapat menganggapnya:

[sometag](.|\n)+?[/sometag]
SynCap
sumber
3
Jangan pernah gunakan (.|\n)+?jika Anda memiliki akses ke pengubah DOTALL. Jika Anda tidak dapat menggunakan (?s)falvor, gunakan [\s\S]/ [\d\D]/ [\w\W], tetapi bukan derai bergantian yang disarankan di sini. Pola ini sangat tidak efisien dan dapat dengan mudah menyebabkan masalah batas waktu.
Wiktor Stribiżew
1
@ WiktorStribiżew: Bisakah Anda menjelaskan mengapa itu tidak efisien? Saya selalu menggunakan [\s\S], tetapi sekilas (.|\n)akan tampak setara? Apakah ini berkaitan dengan grup yang cocok? Tapi (?:.|\n)apakah akan sama?
Cerberus