Neden bazı normal ifade komutlarının çeşitli karakterlerle zıt '\' yorumları vardır?


10

Örneğin, şu komutu ele alalım:

find . -regex ".*\.\(cpp\|h\)"

Bu, dizininizdeki tüm .h ve .cpp dosyalarını bulur. Dönem karakteri '.' düzenli ifadelerde genellikle "herhangi bir karakter" anlamına gelir. Yalnızca gerçek bir döneme uyması için ters eğik çizgi karakteri '\' kullanarak kaçmanız gerekir.

Bu durumda, özel bir anlamı olan bir karakter verildiğinde, temsil ettiği gerçek karakteri elde etmek için karakterden kaçmanız gerekir.

Şimdi, sırasıyla '(', ')' ve '|' karakterleri olan parantez ve "veya" çubuğunu alın. Bunlar ayrıca düzenli ifadeleri gruplandırmak için kullanılan özel anlamlara sahiptir. Ancak, özel bir anlam elde etmek için, karakterler ters eğik çizgi kullanılarak kaçmalıdır! Ters eğik çizgi olmadan, karakterler temsil ettiği gerçek karakterin anlamına gelir.

Neden '.' '(', ')' ve '|' ile farklı muamele gördünüz mü?

Yanıtlar:


12

Cevap gerçekten "çünkü". Bir sürü farklı düzenli ifade sözdizimi vardır ve benzer bir görünümü paylaşırlar ve genellikle temeller aynıdır, ayrıntılarda farklılık gösterirler.

Tarihsel olarak, her aracın kendi yeni uygulaması vardı ve yazarın en iyi düşündüğü şeyi yaptı. Karakterleri kaçarak veya kaçmadan özel yapmak arasında bir denge var - "doğal olarak özel" olan çok fazla karakter var ve her zaman onlarla eşleşmek için onlardan kaçmak zorunda kalıyorsunuz; veya başka bir yolla, () gruplaması gibi ortak regex sözdizimini kullanmak için bir kaç kaçışa ihtiyacınız vardır. Ve bir program yazan herkes, programın nasıl karşılandığının ihtiyaçlarına, doğru yaklaşımın ne olduğuna ve ayın evresine göre nasıl yapılacağına karar verdi.

POSIX'ten " temel normal ifadeleri " ve " genişletilmiş düzenli ifadeleri " tanımlayan bir standardizasyon denemesi vardır . Şaşırtıcı bir şekilde, bunlar birbirlerinden geriye doğru çalışır \- bazen , ancak mükemmel bir tutarlılıkla değil.

Perl düzenli ifadeleri iki nedenden ötürü başka bir defacto standardı haline geldi: birincisi, çok esnek ve güçlüler ve ikincisi, aslında oldukça aklı başındalar , "\ her zaman alfasayısal olmayan bir karakterden kaçıyor" gibi.

GNU Find'ın -regextype, kullanılan normal ifade sözdizimini değiştirebileceğiniz bir seçeneği vardır . Ne yazık ki, "perl" bir seçenek değil, en azından ben var versiyonu. (Varsayılan, şaşırtıcı bir şekilde GNU, "emacs" dır ve sözdizimi burada belgelenmiştir .)

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.