Regex 07 - Veya Özel Karakteri

Regex 07 - Veya Özel Karakteri

Regex 06 - Nokta
Nokta aslında regex’teki joker karakterdir. Yani nokta karakteri, herhangi bir karakter yerine geçebilir.

Önceki Bölüm


Sık sık kullanacağımız bir başka karakter ise veya karakteri.

💡
Özel Karakter: Veya |
Veya, örüntüde birden fazla seçeneği barındırmak için kullanılır.

Bu uzun çizgiyi, klavyenizde Z harfinin solunda yer alan büyük/küçük işaretinin yer aldığı tuşu kullanarak yapıyoruz. "alt gr + <" tuş kombinasyonuyla | işaretini oluşturabilirsiniz.

Karakter sınıflarındaki örneğimizi hatırlayalım:

k[aâ]r

Bunun hem kar hem de kâr kelimelerini yakalayacağından bahsetmiştik. Şimdi aynı örneği veya özel karakterimzle şu şekilde de yazabiliriz:

kar|kâr

Hatta şu şekilde de yazabiliriz:

k(a|â)r

Burada iki önemli nokta var:

  • Parantezler de regex içerisinde özel karakter (metacharacter) olarak algılanır. Alt örüntüleri (sub-expressions) ana örüntüden yalıtmak için kullanılırlar.
  • Yukarıdaki örüntüyü ka|âr olarak parantezsiz yazsaydık eğer, bu örüntü ka ya da âr harf dizilerini bulmaya çalışırdı.

Bu sebeple veya karakteriyle alternasyon (alternation) yapmak istediğinizde, çoğu zaman bunu parantezle tercih etmeniz gerekecektir.

Başka bir örnek daha verelim:

Birinci|1'inci [Ss]ınıf

İlk kısımdaki inci kısımları ortak olduğu için bu ifadeyi şu şekilde kısaltabiliriz:

(Bir|1')inci [Ss]ınıf

Buraya kadar veya özel karakterinin ne kadar faydalı olabileceğini anladığımızı düşünüyorum. Ama verdiğimiz örnekler karakter sınıfları ve veya özel karakteri arasındaki farkı biraz bulanıklaştırmış olabilir.

Bu farkı birkaç madde ile açıklığa kavuşturalım:

  • Bir karakter sınıfı, hedef metindeki yalnızca bir karakterle eşleşir
  • Alternasyonda ise, her bir alternatif başlı başına bir alt örüntü olabileceği için çok daha komplex örüntüler kurmak için faydalı olur.
  • Karakter sınıfı kendi başına ufak bir dilmiş gibi görünürken (kendi içinde tanımlanmış olan özel karakterleri ile), alternasyon ise düzenli ifadelerin bir alt parçası olarak karşımıza çıkıyor. Kendi örüntülerinizi yazarken ikisini de oldukça faydalı bulacaksınız.

Ayrıca alternasyon olan örüntülerde satır başı ve satır sonu özel karakterleri olan şapka (^) işaretini ve dolar ($) işaretini kullanırken de dikkatli olmakta fayda var.

Bir e-mail'deki temel girdi alanlarını yakaladığımızı farz edelim. Aşağıdaki iki örüntüyü evvela bir inceleyelim:

^Gönderen|Alıcı|Konu:
^(Gönderen|Alıcı|Konu):

İlk örüntü parantezle ayrılmadığı için ^Gönderen, Alıcı ya da Konu: karakter dizilerinden birini yakalıyor. Ki bu hiç de istediğimiz bir sonuç değil. Çünkü ^ özel karakterinin ve : işaretinin tüm üç ihtimal için de geçerli olmasını istiyoruz.

İkinci örüntü ise tam da istediğimiz gibi ^Gönderen:, ^Alıcı:,^Konu: karakter dizilerinden birini yakalıyor.


Büyük Küçük Harf Hassasiyetini Ortadan Kaldırmak

Regex motorlarında kullanabileceğimiz ve belirli işlevlere sahip flag adı verilen belirteçler var.

Bunlardan bir tanesi i (insensitive) harfi ile gösterilen -i belirteci. Bu belirteç ile regexi kullandığınızda regex motoru, harfin büyük mü küçük mü yazıldığına bakmaksızın metni örüntüyle eşleştirmeye çalışıyor.

Aşağıdaki örnekte büyük küçük farkı gözetmeksizin bu kelimelerin yakalandığını görebilirsiniz:

Bazı kelimelerin yine de yakalanmadığını fark ettiniz mi? Bu yazılım dünyasında oldukça sık rastlanan durumlardan birisidir. Bu durumun kaynaklanma sebebi "ıöğşç" gibi Türkçe'ye özgü olan karakterlerin büyük ya da küçük karaktere dönüştürülmesinin bazı yazılım dillerince doğru şekilde programlanmamış olmasından kaynaklanıyor.

Hatırlarsanız karakter sınıflarını işlerken [A-Z] aralığında Türkçe karakterlerin olmadığından bahsetmiştik. Eğer üzerinizde çalıştığınız metin Türkçe karakter içeriyorsa, kimi verileri kaçırmadığınızdan emin olmak için bu durumları aklınızda bulundurmaya çalışın.

Sözcük Sınırları (Word Boundries)

Düzenli ifadelerdeki en önemli sorunlardan bir tanesi de yazdığınız örüntünün bir kelimeyi ararken, bu kelimeyi içerisinde barındıran sözcükleri de bulmasıdır.

kar sözcüğünü ararken regex bu sözcüğü barındıran ankara, karantina, karartma gibi sözcüklerle de eşleşecektir.

Bazı regex motorları bu sorunun önüne geçmek için sözcük sınırları (word boundries) adı verilen özel karakterler barındırıyorlar. Regex101 sitesinde yer alan flavorların her birinde \b ile belirtilen bu özel karakterleri, sözcük boyutunda bir ^$ ikilisi olarak düşünebilirsiniz.

Aşağıdaki örneğe bakalım:

\bkar\b

Sözcük sınırlarını belirttiğimizde sadece o sözcüğün yer aldığı ve bitişiğinde başka hiçbir harfin olmadığı satırı yakaladığını görebilirsiniz. Bu özellikle spesifik aramalar yaptığınızda çok kullanışlı olacaktır.

Ayrıca bir önceki bölümde üç harfli kelimeleri ararken kullandığımız ^.at$ örüntüsünü bu özel karakterlerle şu şekilde de yazabiliriz:

\b.at\b