Di https://www.emacswiki.org/emacs/MultilineRegexp kita menemukan petunjuk untuk digunakan
[\ 0- \ 377 [: nonascii:]] * \ n
bukannya standar
. * \ n
untuk mencocokkan karakter apa pun hingga baris baru untuk menghindari stack overflow untuk teks besar (37 KB). Apakah overflow menjadi perhatian di sini, atau apakah pencocokan berjalan untuk mantan juga lebih berkinerja daripada yang kedua?
sumber
[\0-\377[:nonascii:]]*
melakukannya lebih sedikit\\(.\\|\n\\)*
. Jadi saya pikir emacswiki salah dalam hal ini.|
mungkin perlu lebih banyak mundur, tetapi apakah itu benar-benar tergantung pada bagaimana ia dikompilasi.[\0-\377[:nonascii:]]*
(yang agak tidak biasa, karena Anda mungkin lebih baik menggunakanpoint-max
daripada mencarinya melalui regexp seperti itu) (untuk yang penasaran: inti masalahnya adalah apakah serangkaian karakter yang dapat cocok setelah * dipisahkan dari set char yang dapat cocok dengan *. Jika disjoint, maka mesin regexp akan melewatkan rekaman langkah-langkah perantara, dan karenanya menghindari memakan ruang stack. Jadi.*\n
dan[^a]*a
jangan mengkonsumsi stack, sedangkan.*a
tidak).