Her programcının düzenli deyimler hakkında kesinlikle en azından bilmesi gerekenler

Bu metin Mike Malone tarafından yazılmış olan özgün metnin tarafımdan yapılmış olan çevirisidir. Eğer çeviride hata olduğunu düşünüyorsanız bana, özgün metinde hata olduğunu düşünüyorsanız ona yazabilirsiniz.

Düzenli deyim de neyin nesidir?

Düzenli deyimler[0] özel bir yazım tarzı kullanarak bir metni tanımlamaya ve ayrıştırmaya yarayan karakter dizgileridirler. Birçok programcı (hatta bazı iyi olanlar bile) düzenli deyimleri hiçe saymaktadır ki bu büyük bir ayıptır, çünkü çok sık işe yaramaktadırlar. Bir kez işin yolunu yordamını kaptınız mı, düzenli deyimler sayısız sorunların üstesinden gelmekte kullanılabilirler.

Düzenli deyimler çoğunlukla Windows ya da *NIX’deki joker karakterleri gibi çalışırlar; özel * ve ? karakterlerini kullanarak birden çok sayıdaki dosyayı belirtebilirler (joker karakteri anlatırken bir joker karakter mi kullandım ne?). Fakat düzenli deyimlerdeki özel ya da yardımcı karakterler[1] çok daha anlamlıdırlar.

Tıpkı joker karakterler gibi, düzenli deyimler de karakterlerin çoğuna özel bir anlam yüklemeden, onları oldukları gibi işlemden geçirirler. Örneğin, ali düzenli deyimi, yalnızca "a - l - i" harflerini, aynen bulundukları sırada bulacaktır. Fakat düzenli deyimler kullandıkları bir sürü yardımcı karakter sayesinde daha önce bahsettiğimiz joker karakterleri çok ilkel bırakılar.

Yardımcı karakterlerle tanışın: ^[](){}.*?\|+$ ve bazen -

Biliyorum korkutucu görünüyorlar, ama onları bir kez tanıdınız mı aslında ne kadar da hoş olduklarını göreceksiniz.

Satır çapaları: ^ ve $

^ (şapka) ve $ (dolar) yardımcı karakterleri sırasıyla satır başı ve satır sonunu temsil etmektedirler. Daha önce bahsettiğim gibi, ali düzenli deyimi "a - l - i" harflerini bulacaktır, ancak bu satırın herhangi bir yerinde olabilir (örneğin, "benim adım ali" ya da "ali veliali"). ^ karakteri satırın başına çapa atmak için kullanılır, böylece ^ali düzenli deyimi yalnızca ali ile başlayan satırları bulacaktır. Benzer şekilde, ali$ düzenli deyimi "a - l - i" harflerini, bu sırada, yalnızca satır sonlarında bulacaktır (ancak yine de "ali veliali"yi bulacaktır).

Eğer bu iki çapa karakterlerini birlikte kullanırsak belirli bir sıralamadaki karakterleri içeren satırları arayabiliriz. ^ali$ deyimi bir satırda yalnızca kendi başına olan ali sözcüğünü bulacaktır - ne daha fazlası, ne de daha azı. Benzer şekilde ^$ deyimi, başı sonu bir olan, boş satırları bulmakta kullanışlıdır.

Karakter kümesi: []

Karakter kümesi diye bilinen, köşeli parantezler, birtakım karakterlerden herhangi herhangi birini bulmanıza yararlar. Farz edelim ki "sevgi" sözcüğünü bulmak istiyorsunuz, fakat aynı zamanda "sezgi" de bulunsun istiyorsunuz. Bir karakter kümesi ikisini de bulmanıza izin verir. se[vz]gi düzenli deyimi "s, peşinden e, peşinden bir v ya da z, peşinden g, peşinden i" şeklinde okunur.

Eğer [ ... ] yerine [^ ... ] kullanırsanız, bu küme içinde bulunan karakterler haricindeki tüm karakterleri bulur. Kümenin başındaki ^ diziyi olumsuzlar. Kümede bulunmasını istediğiniz karakterleri sıralamak yerine, kümede bulunmasını istemediğiniz karakterleri sıralarsınız. Dikkat edin, buradaki ^ (şapka) karakterinin anlamı karakter kümesinin dışında kullanılana göre farklıdır, dışarıda kullanılırsa bunun anlamı bir satırın başını bulmaktır.

Karakter kümesi yardımcı karakteri: -

Bir karakter kümesinin içinde, karakter kümesi yardımcı karakteri - (kısa çizgi) bir karakter aralığını işaret eder. [0123456789abcdefABCDEF] yerine [0-9a-fA-F] yazabiliriz. Ne kadar da elverişli. Kısa çizgi yalnızca karakter kümesinin içinde bir yardımcı karakterdir, başka herhangi biryerde yalnızca normal kısa çizgi karakterini bulacaktır.

Eğer bir kısa çizgi bir karakter kümesinde birinci karakter ise yardımcı bir karakter olarak sayılmaz (bir aralık belirtmesinin imkanı yoktur, kaldı ki bir aralığın bir başı bir de sonu olması gereklidir), ve normal kısa karakter yerine geçer. Benzer şekilde, soru işareti ve nokta genelde ancak bir kümenin içinde olmadıklarında birer düzenli deyim karakteridirler ([-0-9.?] kümesindeki tek özel karakter sıfır ve dokuz arasındaki kısa çizgidir).

Nokta ile herhangi bir karakteri bulmak: .

. (nokta) yardımcı karakteri herhangi bir karakteri bulan bir karakter kümesi için bir kısaltmadır. Bir karakter dizisinin belirli bir yerindeki herhangi bir karakteri bulmak istediğinizde çok elverişlidir. Bir kez daha, nokta yardımcı karakteri bir karakter kümesinin içindeyken bir yardımcı karakter değildir. Yardımcı karakterler dizisi bir karakter kümesinin içinde ve dışında farklıdırlar.

Değişim yardımcı karakteri: |

| (dik çizgi ya da boru) yardımcı karakteri "veya" anlamına gelir. Birden çok deyimi tek bir deyimde bir araya getirerek içlerinden bir tanesini bulmanızı sağlar. Büyük (üst) deyimi oluşturan küçük (alt) deyimlerin herbirine seçenek adı verilir.

Örneğin, Ali ve Veli ayrık deyimlerdir, ancak Ali|Veli ikisinden birini bulan tek bir deyimdir.

Seçeneklerin kapsamlarını sınırlamak için parantezler kullanılabilir. Ali’yi veya Veli’yi bulan önceki deyimimizi parantezlerin yaratıcı kullanımı sayesinde daha kısa yazabilirdim. (A|Ve)li deyimi aynı şeyi bulacaktır. Gerçekte muhtemelen, daha okunaklı ve bakımı kolay yapılabilir olduğundan, ben yine de birinci deyimi kullanırdım.

Zorunlu olmayan (seçime bağlı) nesneleri bulmak: ?

? (soru işareti) yardımcı karakteri seçime bağlı (zorunlu değil) demektir. Deyimin herhangi bir yerinde olmasına izin verilen, ancak olmasa da olur, bir karakterden sonra konur. Soru işareti yalnızca hemen öncesindeki karakteri etkiler.

Eğer yanlış yazılmış olabileceğini bildiğimden ötürü hem tren hem de tiren sözcüklerini bulmak isteseydim, "t arkasından, belki i, arkasından r, arkasından e, arkasından n" diye okunan, ti?ren düzenli deyimini kullanabilirdim.

Diğer nicelik belirleyiciler: + ve *

Soru işareti gibi, + (artı) ve * (yıldız) yardımcı karakterleri de deyim içinde kendilerinden hemen önce bulunan karakterin bulunabilme sayısını etkilerler (? ile önceki karakter sıfır ya da bir kez bulunabilir). + yardımcı karakteri kendisinden hemen önce gelen karakteri bir ya da daha fazla kez bulurken, * önceki karakteri, sıfır dahil, herhangi bir sayıda bulur.

Eğer ses kaydının yazılı bir kopyasından bir futbol maçının sonucunu konuşmacının kaç kere gol dediğinden bulmaya çalışıyor olsaydım, "gol"ü bulacağı gibi "goooool"ü de bulabilecek olan (ancak "gl"yi değil), go+l düzenli deyimini kullanabilirdim.

Üç yardımcı karakter: soru işareti, artı ve yıldız, nicelik belirleyiciler diye bilinirler çünkü ilişikte oldukları nesnenin miktarını etkilerler.

Nicelik aralığı belirleyici: {}

{enaz,ençok} yardımcı düzeni, kendi en az ve en çok değerlerinizi sağlayarak, belirli bir nesnenin kaç kere bulunabileceğini belirtmenize izin verir. go{1,5}l düzenli deyimi bir önceki örneği yalnızca birden beşe kadar olan sayıdaki o’ları bulacak şekilde kısıtlar.

Çıkış karakteri: \

\ (ters kesme işareti, ters eğik çizgi) yardımcı karakteri özel anlamı olan yardımcı karakterleri özel anlamlarından çıkarmakta kullanılır. Örneğin, ? ya da \ karakterlerini bulmak isteseydiniz, önlerine ters kesme işareti koyarak: \? ya da \\, özel anlamlarını kaldırmış olursunuz.

Ters kesme işareti yardımcı karakter olmayan bir karakterden önce kullanıldığında, kullandığınız düzenli deyim tipine bağlı olarak, farkları anlamlara gelebilir. Perl uyumlu düzenli deyimler (PCRE’ler) için perldoc sayfasında perl düzenli deyimlerine bakabilirsiniz. PCRE’ler aşırı derecede yaygındırlar, bu tip düzenli deyimler PHP, Ruby, ECMAScript/JavaScript ve diğer birçok dildede kullanılabilirler.

Bulmak için parantezleri kullanmak: ()

Birçok düzenli deyim aracı parantezler ile bir deyimin belirli bir alt kümesini yakalamanıza izin verir. Bir alan adının[2] etki alanı[3] bölümünü http://([^/]+) gibi bir deyim ile bulabilirdim. Haydi gelin bu deyimi parçalarına ayırıp nasıl çalıştığına bakalım.

Deyimin başlangıcı oldukça açık: "h - t - t - p - : - / - /" dizisini bulacaktır. Bu başlangıç dizisini, alt deyimi bulan karakterleri yakalamak için kullanılan, parantez izlemektedir. Bu durumda alt deyim, / dışındaki herhangi bir karakteri bir ya da birden fazla kez bulan, [^/]+dir. http://www.pittle.org/weblog gibi bir alan adı için "www.pittle.org" parantezler tarafından bulunacaktır.


0: Düzenli deyim: İng. Regular expression (kısaca regex ya da regexp)
1: Yardımcı karakter: İng. Metacharacter
2: Alan adı, birörnek kaynak konumlayıcı: İng. Uniform Resource Locator (kısaca URL)
3: Etki alanı: İng. Domain name

Tags: , , ,

Leave a Reply