Từ :h E65
chú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
@ 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
@ChristianBrabandt Một bổ sung hữu ích hơn sẽ là triển khai các cờ số như trong
—
Sato Katsura
sed
: s/.../.../3
sẽ 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.
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
\%()
.