Normal ifadede [[.ch.]] Ne anlama geliyor?


11

Alternatif başlık: POSIX uyumlu bir normal ifadede "harmanlama sırası" veya "harmanlama öğesi" nedir?

Tam teknik tanımı POSIX spesifikasyonlarının Bölüm 9.3.5'inde , listedeki # 4 maddesi olarak buldum , ancak benim için net değil.

Örnekler ve açıklamalar için internette dolaştım ve tamamen boş değil , ama kesinlikle aydınlanmadım .

Aldığım tek şey, bazı durumlarda, regex'inizin uzunluğun karşılaştırılması ve "en uzun eşleşmenin" ne olduğunu belirlemek için tek bir karaktermiş gibi birden fazla karakteri tedavi edebilmenizdir (regex'ler açgözlü ve mümkün olan en uzun eşleşmeyi döndür).

Yine de hepsi bu kadar mı? Bunun bir kullanımını görmekte sorun yaşıyorum, ancak anlayışımın eksik olduğundan şüpheleniyorum. Regex için aslında "harmanlama" nedir? [[.ch.]]POSIX spesifikasyonlarındaki örnek bununla nasıl bir ilişki içinde?

Yanıtlar:


7

Harmanlama öğelerine genellikle sıralama bağlamında başvurulur.

Birçok dilde, harmanlama (sözlükte olduğu gibi sıralama) yalnızca karakter başına yapılmaz. Örneğin, Çekçe, charasında değil sıralama yapar cgve ciİngilizce olarak olur, ama sıralamak için bir bütün olarak kabul edilir gibi. O (biz burada bir karakterinden söz edemez, karakter harmanlama unsurların bir alt kümesidir) arasındaki o sıralar bir harmanlama elementtir hve i.

Şimdi şunu sorabilirsiniz: Bunun düzenli ifadelerle ne ilgisi var? , Neden parantez ifadesindeki bir harmanlama öğesine başvurmak isteyeyim? .

Parantez ifadelerinin içinde, düzen kullanılır. Örneğin [c-j], içinde ve arasındaki karakterleri istiyorsunuz . Peki, öyle mi? Orada öğeleri harmanlamayı tercih edersiniz. Çek yerel ayarlarında :cj[h-i]ch

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

Bu nedenle, köşeli parantez içindeki bir dizi harmanlama öğesini listeleyebiliyorsanız, bunları tek tek de listeleyebilmeyi beklersiniz. ve ve ile karakterleri [a-cch]arasındaki harmanlayan öğelerle eşleşir . Sahip olmak ve harmanlama öğesine sahip olmak için yeni bir sözdizimine ihtiyacımız var:accha-cch

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

(arasında olanlar ave cve chbir tane).

Şimdi, dünya henüz mükemmel değil ve muhtemelen asla olmayacak. Yukarıdaki örnek bir GNU sisteminde idi ve işe yaradı. Bir harmanlama elemanının başka bir örneği, eUTF-8'de ( olduğu $'e\u0301'gibi işlenir ) birleştirilen akut bir vurgu ile olabilir .$'\u00e9'é

é ve é aynı karakterdir, ancak biri bir karakterle, diğeri iki ile temsil edilir.

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

Bazı sistemlerde düzgün çalışır ancak diğerleri üzerinde çalışmaz (örneğin GNU'larda değil). Ve bu gitmediği belirsiz $'[[.\ue9.]]'sadece aynı olmalıdır $'\ue9'ya da her ikisi $'\ue9've $'e\u301'.

Alfabetik olmayan komut dosyalarından veya farklı, bölgesel, sıralama düzenlerine sahip komut dosyalarından bahsetmiyorum ffi, such ( bir karakterde) gibi basit bir API ile işlem yapmak zorlaşır.


1

İngilizce olmayan (ascii olmayan) karakterler kullanıldığında bu yararlıdır. Bahsettiğiniz örnek chbir digrafidir , yani bazı dillerde alfabelerinde bir İngiliz alfabesinde iki harfle temsil edilebilen / kullanılabilen bir harf vardır.

Kullandığınızda [.ch.]bir regexp'nin içinde, temelde ki: "Ben digraf ile İngilizce olmayan bir giriş dizisi beklemek chbenim regexp'in tek karakteri eşleştirmek istiyoruz. chBenim programlama dili / regex motoru / klavye bana bu digraph 's yazmak için izin vermez. işareti, yani ben yazıyorum [.ch.]. Bunu ctakip eden bir demek istemiyorum h. Lütfen sadece digrafın oluşumlarını tek bir karakter olarak bulun. "

[[.ch.]]digrafinin aa karakter kümesinin bir parçası olduğu anlamına gelir. Bu durumda aslında sadece bir karakter. Sadece standart normal ifade gösterimi.


Gönderen Stephane'ın cevap gibi görünüyor ch olduğunu aslında iki farklı karakter; sadece sıralama amaçlı olarak değerlendirilir. "Digraph" ın geçerli bir terim olduğundan emin misiniz?
Wildcard
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.