Чому Vge regex не дозволяє використовувати більше 9 груп захоплення?


16

Звідси :h E65ми бачимо, що Vim не дозволяє використовувати більше 9 груп захоплення в команді підстановки.

Наприклад, працює наступна команда:

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

Але ця з ще однією групою захоплення не вдасться:

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

Моє запитання не в тому, чому він не вдається (це жорсткий ліміт Vim), а не в тому, чому Vim взагалі має цю межу?

Крім того, я знаю, що реальний вираз із життя з більш ніж 9 групами захоплення, ймовірно, буде досить жахливим для читання та підтримки, але мені все одно цікаво.


2
Може бути , не відноситься тільки до Vim: stackoverflow.com/a/10993346/2558252
nobe4

1
@ nobe4: Цікаво! Тож, можливо, люди, що створювали ці інструменти, вважали, що більше 9 груп були марними ...
statox

Я припускаю, що ця межа походить від vi, який успадкував ліміт від ed / sed. Деякі роки тому я зробив патч для підтримки до 99 груп, але він не був включений
Крістіан Брабандт

1
@ChristianBrabandt Більш корисним доповненням було б реалізація числових прапорів, як у sed: s/.../.../3замінила б лише 3-е виникнення шаблону. Це, мабуть, особливість, яку я найбільше сумую у Vim.
Сато Кацура

2
Підтримка названих захоплень буде ще одним способом полегшення цієї проблеми. При цьому, більшість разів я бачив десь близько 9 груп захоплення, коли люди не знали, що можуть використовувати групи, що не захоплюють - \%().
Jamessan

Відповіді:


24

Очевидна причина полягає в тому, що групи з двома або більше цифрами неоднозначні: слід \12сприймати їх як групу 12 або як групу 1, за якою слідує рядок 2?

Є й інші причини, пов'язані з ефективністю (експоненціальний час узгодження тощо). Це були шоу-пробки, коли edписали. Відтоді були виявлені кращі алгоритми.


Це хороша можливість, чи є у вас якісь посилання / читання щодо цього?
nobe4

2
@ nobe4 Для частини неоднозначності: ні, але IMO це очевидно. З точки зору ефективності вам доведеться прочитати про ранню реалізацію регулярних виразів. Це була відома в той час проблема. Точних цитат у мене немає, але їх не важко знайти.
Сато Кацура

Дійсно, це звучить абсолютно правдоподібно.
statox

4
Так, майже напевно, що аналізатор був написаний, щоб шукати одну цифру після нахилу, і ніколи не змінювався. Це було досить часто, дуже давно. Інші мови придумали способи цього (наприклад, розглядаючи \11лише посилання на захоплення, якщо їх принаймні 11, що непослідовно, але зазвичай добре; і такі речі, як \g{11}для зворотних посилань і ${11}заміни), але vim ніколи представив будь-яку з них.
варення
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.