Vim'in normal ifade büyüleri iyi bilinen normal ifade sınıflarıyla uyumlu mu?


16

Birçok Unix aracının düzenli ifade sözdizimi genellikle POSIX kodlu Temel ve Genişletilmiş Düzenli İfadelerdir (sırasıyla BRE ve ERE) ve bazı modern uygulamalarda Perl stili (PCRE bunun bir uygulamasıdır).

Vim'in büyü seviyeleri ile bu tür harici olarak tanımlanmış, ancak iyi bilinen sınıflar arasında bire bir yazışma var mı? POSIX aramaları içermediği sürece \mBRE ve \vERE gibi görünüyor .

Böyle bir yazışma varsa, bir yerde tanımlanmış mı? pattern.txtsadece bir sözü var POSIX.

Yoksa Vim'in düzenli ifadelerini tanımlamak için "sihir" ile mi bağlı kalmalıyız?


3
AFAIK'in Vim'e özgü kelime sınırlarını \viçerdiğinden emin olabilirsiniz <>. Yani hayır, sadece "Vim normal ifadesi" olarak tanımlayın. (Olumlu olmadığım için cevap olarak yayınlamıyorum)
Doorknob

@Doorknob, yorumların cevapları hakkındaki bu tartışmayı ilginç bulabileceğinizi düşünüyorum . Yorumunuz üç yukarı oy içerdiğinden ve size yanlış olduğunu söyleyen hiçbir yorum olmadığından, muhtemelen doğrudur (emin değilim), ancak önerilen düzenlemeler et. ark. doğruluğunu artırmak imkansızdır. Yayınlanan bir cevap olarak, daha iyi doğruluk için düzenlenmiş olabilir, yukarı oy, aşağı oy, cevap, vb
Wildcard

Yanıtlar:


22

Özetle, hayır. Vim'in normal ifadesi benzersiz bir lezzettir ve başka bir lezzet gibi davranmasını sağlamak için hiçbir seçenek yoktur.

Bunun iyi bir şey olduğunu düşünüyorum.

sihirli

Bu 'magic'seçenek, Vim'in kullandığı normal ifadenin tadını değiştirmez. Sadece birçok \kaçan atomun davranışını tersine çevirir .

Örneğin, varsayılan olarak, "önceki atomun biri veya daha fazlası" anlamına gelen +değişmez bir +karakterdir \+. Buna karşılık, *"önceki atomun sıfır veya daha fazlası" anlamına gelirken \*, bir değişmezdir *. Birçok insan bunu oldukça kafa karıştırıcı buluyor. \vDeseninizde kullanmak onu biraz daha tutarlı hale getirir. :help 'magic'iyi bir özet sunar:

after:    \v       \m       \M       \V         matches ~
                'magic' 'nomagic'
          $        $        $        \$         matches end-of-line
          .        .        \.       \.         matches any character
          *        *        \*       \*         any number of the previous atom
          ()       \(\)     \(\)     \(\)       grouping into an atom
          |        \|       \|       \|         separating alternatives
          \a       \a       \a       \a         alphabetic character
          \\       \\       \\       \\         literal backslash
          \.       \.       .        .          literal dot
          \{       {        {        {          literal '{'
          a        a        a        a          literal 'a'

Şahsen, varsayılan davranış foo(tam anlamını kullanarak gibi şeyler aramak için nadir değildir kod dosyaları için güzel olduğunu düşünüyorum (.

Vim'in kendi regex lezzeti

Vim'in PCRE destekli olmasını isteyen birçok kişiye tanık oldum. Şahsen, Vim'in regex lezzetini destekleyen diğer araçların olmasını dilerim. PCRE'de başarılması imkansız veya çok hantal olan bazı yeteneklere sahiptir.

PCRE'de imkansız

Lookaround , bir desenin eşleştirmeye çalıştığınız desenden önce veya sonra eşleştiğini veya eşleşmediğini iddia edebileceğiniz yaygın bir özelliktir. Örneğin, PCRE kalıbı q(?!u)(veya Vim normal ifade kalıbı qu\@!) q, a ile takip edilmeyen bir kalıpla eşleşir u. (Bu daha doğru q[^u], olduğu gerektiren bir karakter sonra q).

Değişken uzunlukta negatif görünüm

PCRE ve diğer birçok aroma, negatif gözetleme deseninin sabit uzunlukta olması gerektiği konusunda bir kısıtlamaya sahiptir. Bunun anlamı gibi bir desen olduğunu (?<![a-z]{3})foo"dizesini anlamına foo değil öncesinde tam olarak 3 küçük harfler") ince, ama (?<![a-z]+)foo( "dizesi anlam fooönünde değil herhangi bir sayı küçük harflerin") değildir.

Bu kısıtlama Vim'de mevcut değildir. Vim'de, \([a-z]\+\)\@<!foobakmak biraz çirkin olsa da , bir desen mükemmel bir şekilde geçerlidir.

Vim normal ifadesinde daha kolay

Vim'in regex lezzetinde bazı şeyler çok daha hoş.

Maç bağlantılarının başlangıcı ve sonu

En dikkate değer, bence, \zsve \zeçapalar. Bunlar maçın başlangıcını ve bitişini belirlemenizi sağlar. Örneğin, foo(\zs.*\ze)yalnızca bir işlev çağrısında (ve )arasındaki bir işlev çağrısıyla eşleşir foo(...). Bu PCRE'de yapılabilir, ancak biraz sıkıcı olan görünümün kullanımını gerektirir:(?<=foo\().*(?=\))

Önek eşleme

Vim'in yapabileceği bir başka harika şey, belirli bir karakter dizisinin herhangi bir önekiyle (boş önek dahil) eşleşmektir. Örneğin, ilgili eşleştirmek için f, fo, fooya da foodmodel, f\%[ood]kullanılabilir. PCRE'de böyle bir model gibi görünecektir f(o(od?)?)?. (Bunu daha uzun bir ip için düşünün!)

Eşleşen imleç, çizgi ve sütun konumları

Vim'in normal ifadesinin, arabellekteki konumları eşleştirmek için bazı bağlantıları vardır.

  • \%23c sütun 23 ile eşleşir
  • \%<23csütun 23'ten önceki eşleşmeler
  • \%>23c23 sütunundan sonraki maçlar
  • \%16l 16 numaralı satırla eşleşir
    • Sütuna benzer şekilde, bir satır numarasından önce veya sonra tutturucular da vardır
  • \%# imleç konumuyla eşleşir

Bence Vim'in normal ifade lezzetini benimsemeye değer. Öncelikle programlama için kullanılan bir metin düzenleyicide kullanım için uygundur ve oldukça güçlüdür.

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.