Mengapa Vim regex tidak mengizinkan lebih dari 9 grup tangkap?

16

Dari :h E65kita dapat melihat bahwa Vim tidak mengizinkan lebih dari 9 kelompok tangkapan dalam perintah substitusi.

Sebagai contoh, perintah berikut akan berfungsi:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)/\9\8\7\6\5\4\3\2\1

Tetapi yang satu ini dengan satu lagi grup penangkap akan gagal:

s/\v(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)/\10\9\8\7\6\5\4\3\2\1

Pertanyaan saya bukan tentang mengapa gagal (itu adalah batas keras Vim) tetapi tentang mengapa Vim memiliki batas ini sama sekali?

Juga, saya sadar bahwa regex kehidupan nyata dengan lebih dari 9 grup tangkap mungkin akan sangat mengerikan untuk dibaca dan dipelihara tetapi saya masih penasaran.

statox
sumber
2
Mungkin tidak terkait hanya dengan Vim: stackoverflow.com/a/10993346/2558252
nobe4
1
@ nobe4: Menarik! Jadi mungkin orang yang membuat alat ini menganggap bahwa lebih dari 9 kelompok tidak berguna ...
statox
Saya kira batas ini berasal dari vi, yang mewarisi batas dari ed / sed. Beberapa tahun yang lalu saya membuat tambalan untuk mendukung hingga 99 kelompok, tetapi itu tidak termasuk
Christian Brabandt
1
@ChristianBrabandt Tambahan yang lebih berguna adalah mengimplementasikan flag numeric seperti pada sed: s/.../.../3akan mengganti hanya kejadian ke-3 dari pola. Ini mungkin fitur yang paling saya lewatkan di Vim.
Sato Katsura
2
Mendukung tangkapan bernama akan menjadi cara lain untuk mengatasi masalah ini. Yang sedang berkata, yang paling sering saya lihat di dekat 9 kelompok penangkap adalah ketika orang tidak tahu mereka bisa menggunakan kelompok yang tidak menangkap - \%().
jamessan

Jawaban:

24

Alasan yang jelas adalah bahwa kelompok dengan dua digit atau lebih bersifat mendua: harus \12diambil sebagai kelompok 12, atau sebagai kelompok 1 diikuti oleh string 2?

Ada alasan lain yang terkait dengan efisiensi (waktu pencocokan eksponensial dan sejenisnya). Ini adalah show stopper ketika edditulis. Algoritma yang lebih baik telah ditemukan sejak itu.

Sato Katsura
sumber
Ini adalah kemungkinan yang baik, apakah Anda memiliki referensi / bacaan tentang ini?
nobe4
2
@ nobe4 Untuk bagian ambiguitas: tidak, tapi IMO sudah jelas. Untuk bagian efisiensi, Anda harus membaca tentang implementasi awal regexps. Itu adalah masalah yang terkenal saat itu. Saya tidak memiliki kutipan yang tepat, tetapi mereka seharusnya tidak sulit ditemukan.
Sato Katsura
Memang itu terdengar sangat masuk akal.
statox
4
Ya, hampir pasti bahwa parser ditulis untuk mencari satu digit setelah backslash, dan tidak pernah berubah. Ini sudah cukup umum, dulu sekali. Bahasa lain telah menemukan cara untuk mengatasi hal ini (misalnya, hanya mempertimbangkan \11referensi untuk menangkap jika ada setidaknya 11 dari mereka, yang tidak konsisten tetapi biasanya baik-baik saja; dan hal-hal seperti \g{11}untuk referensi dan ${11}penggantian), tetapi vim tidak pernah memperkenalkan semua itu.
hobbs