Temel Düzenli İfadeleri Daha İyi Arama ve Zamandan Tasarruf Etmek İçin Nasıl Kullanılır?
Grep ile arama yapıyor veya toplu olarak sizin için dosyaları yeniden adlandırabilecek programlara bakıyorsanız, işinizi yapmanın daha kolay bir yolu olup olmadığını merak ettiniz. Neyse ki, var ve buna “normal ifadeler” denir.
(XKCD.com'dan Comic)
Normal İfadeler nedir??
Düzenli ifadeler çok özel bir biçimde biçimlendirilmiş ve birçok farklı sonuç için geçerli olan ifadelerdir. Ayrıca “regex” veya “regexp” olarak da bilinir, bunlar genellikle arama ve dosya adlandırma işlevlerinde kullanılır. Bir regex, tümü aranan birkaç farklı olası çıktı oluşturmak için bir formül gibi kullanılabilir. Alternatif olarak, bir regex belirterek bir dosya grubunun nasıl adlandırılması gerektiğini belirleyebilirsiniz ve yazılımınız artımlı olarak bir sonraki amaçlanan çıktıya geçebilir. Bu şekilde, birden fazla klasördeki birden fazla dosyayı çok kolay ve verimli bir şekilde yeniden adlandırabilir ve basit bir numaralandırma sisteminin sınırlarının ötesine geçebilirsiniz..
Düzenli ifadelerin kullanımı özel bir sözdizimine dayandığından, programınız bunları okuma ve ayrıştırma yeteneğine sahip olmalıdır. Windows ve OS X için birçok toplu iş dosyası yeniden adlandırma programı regexps'in yanı sıra platformlar arası arama aracı GREP (Yeni Başlayanlar için Bash Komut Dosyası Kılavuzumuzda değindiğimiz) ve * Nix için Awk komut satırı aracını da destekliyor. Ayrıca, birçok alternatif dosya yöneticisi, rampa ve arama aracı bunları kullanır ve Perl ve Ruby gibi dilleri programlamada çok önemli bir yere sahiptir. .NET, Java ve Python gibi diğer geliştirme ortamlarının yanı sıra yaklaşmakta olan C ++ 11'in tümü normal ifadeleri kullanmak için standart kütüphaneler sunar. Tahmin edebileceğiniz gibi, bir programa girdiğiniz kod miktarını en aza indirmeye çalışırken gerçekten yararlı olabilirler.
Karakterlerden Kaçış Hakkında Bir Not
Size örnekleri göstermeden önce, bir şeyi işaret etmek istiyoruz. Normal ifadelerin nasıl uygulanacağını göstermek için bash kabuğunu ve grep komutunu kullanacağız. Sorun şu ki, grep'e geçirilmesi gereken özel karakterleri kullanmak istiyoruz ve bash kabuğu bu karakteri yorumlayacaktır çünkü kabuk da onu kullanır. Bu şartlar altında, bu karakterlerden “kaçmamız” gerekir. Bu kafa karıştırıcı olabilir çünkü karakterlerin “kaçması” da regexps içinde gerçekleşir. Örneğin, eğer bunu grep'e girmek istiyorsak:
\<
Bunu şu şekilde değiştirmemiz gerekecek:
\\\<
Buradaki her özel karakter bir ters eğik çizgi alır. Alternatif olarak, tek tırnak işaretleri de kullanabilirsiniz:
'\<'
Tek tırnak, bash'a onların içinde ne olduğunu yorumlamamasını söyler. Bu adımların atılmasını zorunlu tutsak da, size gösterebilmemiz için, programlarınız (özellikle GUI tabanlı olanlar) genellikle bu ekstra adımları gerektirmez. İşleri basit ve anlaşılır tutmak için, gerçek normal ifade size alıntı metin olarak verilecek ve komut satırı ekranlarında kaçan sözdizimini göreceksiniz..
Nasıl Genişliyorlar??
Regexps, bilgisayarınızın çoktan seçmeli olarak genişleyebilmesi için, terimleri ifade etmenin gerçekten özlü bir yoludur. Aşağıdaki örneğe bir göz atalım:
Tom [0123456789]
Köşeli parantezler - [ve] - ayrıştırma motoruna içeride ne olursa olsun, herhangi bir ONE karakterinin eşleşmesi için kullanılabileceğini söyler. Bu parantezin içindeki her neye karakter seti denir.
Dolayısıyla, çok sayıda girişimiz olsaydı ve arama yapmak için bu regex'i kullanırsak, aşağıdaki terimler eşleşecekti:
- tom
- tom0
- tom1
- ZK2
- tom3
ve bunun gibi. Bununla birlikte, aşağıdaki liste eşleşmeyecek ve sonuçlarınızda gösterilmeyecektir:
- domates ; regex "tom" dan sonra gelen herhangi bir mektubu hesaba katmaz.
- Tom; regex büyük / küçük harf duyarlıdır!
Ayrıca, mevcut bir karakter olduğu sürece herhangi bir karakterin bulunmasına izin verecek bir süre (.) İle aramayı da seçebilirsiniz..
Gördüğünüz gibi, grepping ile
.tom
Başlangıçta sadece “tom” terimlerini getirmedi. “Yeşil Domates” bile geldi, çünkü “Tom” dan önceki boşluğun bir karakter olduğu düşünülüyor, ancak “TomF” gibi terimler başlangıçta bir karaktere sahip değildi ve bu nedenle göz ardı edildi..
Not: Grep'in varsayılan davranışı, bir kısmı regex'inizle eşleştiğinde tam bir metin satırı döndürmektir. Diğer programlar bunu yapamayabilir ve '-o' bayrağıyla grepte kapatabilirsiniz.
Ayrıca burada olduğu gibi bir boru (|) kullanarak da değişiklik belirtebilirsiniz:
speciali (ler | z) e
Bu ikisini de bulacak:
- uzmanlaşmak
- uzmanlaşmak
Grep komutunu kullanırken, özel karakterlerden (, |, ve) ters eğik çizgilerden kaçmalı ve bunun çalışması ve çirkin hatalardan kaçınmak için '-E' işaretini kullanmalıyız..
Yukarıda bahsettiğimiz gibi, bunun nedeni bash kabuğuna bu karakterleri aşmak ve onlarla hiçbir şey yapmamak için iletmemizi söylememiz gerektiğidir. '-E' bayrağı, parantez ve boruyu özel karakter olarak kullanmasını söyler..
Hem köşeli parantezinizin içinde hem de setin başında bulunan bir şapka kullanarak hariç tutabilirsiniz.
tom [^ F | 0-9]
Yine, grep ve bash kullanıyorsanız, o borudan kaçmayı unutmayın!
Listede bulunan ancak görünmeyen terimler şunlardır:
- tom0
- tom5
- tom9
- tomF
Bunlar bizim regex eşleşmedi.
Ortamları Nasıl Kullanabilirim?
Genellikle, sınırları temel alarak arama yaparız. Bazen sadece kelimenin başında, kelimenin sonunda veya kod satırının sonunda beliren dizgileri isteriz. Bu, çapa dediğimiz şeyi kullanarak kolayca yapılabilir..
Bir şapka kullanmak (parantez dışında) bir çizginin “başlangıcını” belirlemenizi sağlar.
^ tom
Satırın sonunu aramak için dolar işaretini kullanın..
tom $
Bu durumda arama dizemizin bağlantı noktasından ÖNCE geldiğini görebilirsiniz..
Ayrıca, satırların başında değil, kelimelerin başında veya sonunda görünen eşleşmeler için de.
\
tom \>
Bu makalenin başındaki notta belirttiğimiz gibi, bu özel karakterlerden kaçmamız gerekiyor çünkü bash kullanıyoruz. Alternatif olarak, tek tırnak işaretleri de kullanabilirsiniz:
Sonuçlar aynı. Tek tırnak kullandığınızdan ve çift tırnak kullanmadığınızdan emin olun..
Gelişmiş Regexps İçin Diğer Kaynaklar
Burada sadece buzdağının tepesine düştük. Ayrıca para birimi işaretçisi tarafından tanımlanan para terimlerini arayabilir ve üç veya daha fazla eşleşen terimden birini arayabilirsiniz. İşler gerçekten karmaşık olabilir. Düzenli ifadeler hakkında daha fazla bilgi edinmek istiyorsanız, lütfen aşağıdaki kaynaklara bir göz atın..
- Zytrax.com, bazı şeylerin neden eşleşmediğini ve eşleşmediğini gösteren belirli örnekleri içeren birkaç sayfaya sahiptir..
- Regular-Expressions.info ayrıca daha gelişmiş malzemelerin birçoğu için bir katil rehbere ve kullanışlı bir referans sayfasına sahiptir.
- Gnu.org, regexps komutunu grep ile kullanmaya adanmış bir sayfaya sahiptir..
Ayrıca RegExr adlı ücretsiz Flash tabanlı çevrimiçi bir aracı kullanarak normal ifadelerinizi oluşturabilir ve test edebilirsiniz. Yazarken çalışır, ücretsizdir ve çoğu tarayıcıda kullanılabilir.
Normal ifadeler için sık kullandığınız var mı? Onları kullanan büyük bir parti renamer biliyor musunuz? Belki de sadece grep-fu için övünmek istiyorsun. Düşüncelerinizi yorum yaparak katkıda bulunun!