Vim normal ifadesi neden 9'dan fazla yakalama grubuna izin vermiyor?


16

Dan :h E65biz Vim bir ikame komutu fazla 9 yakalama grupları izin vermez görebiliyoruz.

Örneğin, aşağıdaki komut çalışacaktır:

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

Ancak bir tane daha yakalama grubuna sahip olan bu başarısız olacaktır:

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

Sorum neden başarısız olduğu hakkında değil (bu bir Vim zor sınırı), ama Vim'in neden bu limite sahip olduğu hakkında ?

Ayrıca, 9'dan fazla yakalama grubuna sahip gerçek bir hayat regex'inin okumak ve sürdürmek için oldukça korkunç olacağını biliyorum ama hala merak ediyorum.


2
Belki sadece Vim ile ilgili değil: stackoverflow.com/a/10993346/2558252
nobe4

1
@ nobe4: İlginç! Belki de bu araçları oluşturan insanlar 9'dan fazla grubun işe yaramaz olduğunu
düşündüler

Sanırım bu sınır, ed / sed'den miras alan vi'dan geliyor. Birkaç yıl önce 99 grubu desteklemek için bir yama yaptım, ancak dahil değildi
Christian Brabandt

1
@ChristianBrabandt Aşağıdakiler gibi sayısal bayraklar uygulamak daha yararlı bir ekleme olacaktır sed: s/.../.../3örüntünün sadece 3. tekrarının yerini alır. Bu muhtemelen Vim'de en çok özlediğim özellik.
Sato Katsura

2
Adlandırılmış yakalamaları desteklemek, bu sorunu hafifletmenin başka bir yolu olacaktır. Bununla birlikte, çoğu zaman 9 yakalama grubunun yakınında herhangi bir yerde gördüm, insanların yakalamayan grupları kullanabileceklerini bilmedikleri zamandı \%().
jamessan

Yanıtlar:


24

Açık olan nedeni, iki veya daha fazla basamaklı grupların belirsiz olmasıdır: \12grup 12 veya grup 1 olarak 2mı , ardından dize mi alınmalıdır ?

Verimlilik ile ilgili başka nedenler de vardır (üstel eşleşme süresi ve benzerleri). Bunlar edyazıldığında bir gösteri tıpasıydı . O zamandan beri daha iyi algoritmalar keşfedildi.


Bu iyi bir olasılık, bununla ilgili herhangi bir referansınız / okumanız var mı?
nobe4

2
@ nobe4 Belirsizlik kısmı için: hayır, ama IMO açık. Verimlilik kısmı için normal ifadelerin erken uygulamaları hakkında bilgi edinmelisiniz. O zamanlar iyi bilinen bir problemdi. Tam alıntılarım yok, ama bulmak zor olmamalı.
Sato Katsura

Gerçekten de bu tamamen mantıklı geliyor.
statox

4
Evet, neredeyse ayrıştırıcı ters eğik çizgiden sonra tek bir rakam aramak üzere yazılmıştır ve asla değişmemiştir. Bu uzun zaman önce yeterince yaygındı. Diğer diller bunun etrafında yollar bulmuşlardır (örneğin, yalnızca \11en az 11 tanesi tutarsız, ancak genellikle iyi ise ve bir yakalama \g{11}ve ${11}ikame için olan şeyler gibi bir yakalama referansını dikkate alarak ), ancak vim asla bunlardan herhangi birini tanıttı.
Ocaklar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.