Tại sao Vim regex không cho phép nhiều hơn 9 nhóm chụp?


16

Từ :h E65chúng ta có thể thấy rằng Vim không cho phép hơn 9 nhóm bắt giữ trong một lệnh thay thế.

Ví dụ: lệnh sau sẽ hoạt động:

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

Nhưng nhóm này có thêm một nhóm bắt giữ sẽ thất bại:

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

Câu hỏi của tôi không phải là tại sao nó thất bại (đó là giới hạn cứng Vim) mà là tại sao Vim có giới hạn này?

Ngoài ra, tôi biết rằng một regex ngoài đời thực với hơn 9 nhóm bắt giữ có lẽ sẽ rất quái dị để đọc và duy trì nhưng tôi vẫn tò mò.


2
Có lẽ không chỉ liên quan đến Vim: stackoverflow.com/a/10993346/2558252
nobe4

1
@ nobe4: Thú vị! Vì vậy, có thể mọi người tạo ra các công cụ này cho rằng hơn 9 nhóm là vô dụng ...
statox

Tôi cho rằng giới hạn này đến từ vi, kế thừa giới hạn từ ed / sed. Vài năm trước tôi đã tạo một bản vá để hỗ trợ tới 99 nhóm, nhưng nó không được bao gồm
Christian Brabandt

1
@ChristianBrabandt Một bổ sung hữu ích hơn sẽ là triển khai các cờ số như trong sed: s/.../.../3sẽ chỉ thay thế lần xuất hiện thứ 3 của mẫu. Đây có lẽ là tính năng tôi nhớ nhất trong Vim.
Sato Katsura

2
Hỗ trợ các vụ bắt giữ có tên sẽ là một cách khác để giảm bớt vấn đề này. Điều đó đang được nói, hầu hết các lần tôi thấy bất cứ nơi nào gần 9 nhóm bắt giữ là khi mọi người không biết họ có thể sử dụng các nhóm không bắt giữ - \%().
jamessan

Câu trả lời:


24

Lý do rõ ràng là các nhóm có hai hoặc nhiều chữ số không rõ ràng: nên \12được lấy là nhóm 12 hay nhóm 1 theo sau là chuỗi 2?

Có những lý do khác liên quan đến hiệu quả (thời gian phù hợp theo cấp số nhân và tương tự). Đây là một điểm dừng chương trình khi edđược viết. Các thuật toán tốt hơn đã được phát hiện kể từ đó.


Đây là một khả năng tốt, bạn có bất kỳ tài liệu tham khảo / đọc về điều này?
nobe4

2
@ nobe4 Đối với phần mơ hồ: không, nhưng IMO thì rõ ràng. Về phần hiệu quả, bạn phải đọc về việc triển khai sớm các biểu thức chính quy. Đó là một vấn đề nổi tiếng vào thời điểm đó. Tôi không có trích dẫn chính xác, nhưng chúng không khó tìm.
Sato Katsura

Quả thực là âm thanh hoàn toàn hợp lý.
statox

4
Vâng, gần như chắc chắn rằng trình phân tích cú pháp đã được viết để tìm kiếm một chữ số sau dấu gạch chéo ngược và không bao giờ thay đổi. Điều này là đủ phổ biến, một thời gian dài trước đây. Các ngôn ngữ khác đã đưa ra các cách xoay quanh vấn đề này (ví dụ, chỉ xem xét \11một tham chiếu đến một bản chụp nếu có ít nhất 11 trong số chúng, không nhất quán nhưng thường ổn, và những thứ như phản hồi \g{11}${11}thay thế), nhưng vim chưa bao giờ giới thiệu bất kỳ trong số đó.
hobbs
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.