Regex 05 - Karakter Sınıfları

Regex 05 - Karakter Sınıfları

Regex 04 - Satır Başı ve Satır Sonu Karakterleri
İlk özel karakterlerimiz mantığını anlaması belki de en kolay olan ^ (şapka/caret) ve $ (dolar/dollar) işaretleri olacak.

Önceki Bölüm


Bu bölümde karakter sınıflarından bahsedeceğiz. Karakter sınıfları iki yeni özel karakterlerimiz olan köşeli parantezlerle [] tanımlanırlar.

Diyelim ki bir metnin içerisinde kar ve kâr kelimelerinin ikisini birden yakalamak istiyoruz. Karakter sınıfını regex örüntüsünün herhangi bir noktasında hangi karakterlerin mümkün olduğunu göstermek için kullanabiliriz.

Bir regex içerisinde a karakteri sadece a harfini yakalar ve â karakteri de sadece â harfini yakalarken [aâ] örüntüsü ikisini birden yakalar.

Yani k[aâ]r olarak yazılan bir regex örüntüsünü şu şekilde düşünebiliriz:

k[aâ]r => "k karakterinden hemen sonra a ya da â karakteri ve hemen sonra r karakteri"

Eğer siz de benim gibi şapkalı kelimeler konusunda şüpheye düşen bir insansanız, aramalarınızı bu şekilde yapmanız ve bütün kelimeleri yakaladığınızdan emin olmanız mümkün.

Burada dikkat etmeniz gereken bir diğer husus da normalde regex'leri sesli ve mekanik bir şekilde okurken "hemen sonra" olarak yazıyor ve algılıyor oluşumuz. Ama karakter sınıflarında durum tam tersi. Karakter sınıfının içerisindeki herhangi bir karakter bu regex örüntüsünü karşılayacağı için, o kısmı "ya da" olarak düşünmek gerekiyor.

İsterseniz karakter sınıflarını büyük harf - küçük harf farkını ortadan kaldırmak için kullanabilirsiniz. Aşağıdaki örneğe bakalım:

[Kk][aâ]r

Yine de bu regex dizisinin başka kelimelerin içerisinde yer alan kar ve kâr karakter dizilerini yakalayacağını unutmayalım. (bkz. karakter, hünkâr)

İstediğimiz kelimeleri tekil olarak nasıl yakalayabileceğimizi birkaç adet özel karakter daha öğrendikten sonra anlatacağım.

Karakter sınıflarının içerisine istediğiniz kadar karakter koymakta özgürsünüz. Örneğin [12345].

Bu regex örüntüsünu <H[12345]> şeklinde kullanarak HTML'deki başlık taglerini (<H1>, <H2>, <H3> vs.) yakalamak için kullanabilirsiniz.

Karakter Sınıfında Aralıklar (Range)

Karakter sınıfının içerisindeki iki özel karakterimizden ilki kısa çizgi -.

Karakter içerisindeki kısa çizgi bize bir aralık (range) belirtmemizi sağlıyor. Örneğin aşağıdaki regexler farklı yazılsalar da aynı şeyi belirtiyorlar:

[0123456789] ya da [0-9]

[abcdefghijklmnopqrstuvwxyz] ya da [a-z]

Burada alfabeyi yazarken Türkçe karakter kullanmadığımı fark ettiniz mi? Bunun sebebi çoğu regex motorunda [a-z] aralığının yalnızca ASCII karakterleri içermesidir. Karakter sınıfının Türkçe karakterleri de yakalamasını istiyorsanız şu şekilde yazmayı deneyin: [a-zıçşğüö]

Farklı aralıkları arka arkaya da yazabilirsiniz:

[01234abcdefABCD] ya da [0-4a-fA-D] ya da [A-D0-4a-f] (Aralıkları hangi sırayla yazdığınızın bir önemi yok.)

Hatta aralıkları diğer gerçek karakterlerle de birleştirebilirsiniz.

[a-z?!._] => Bu regex örüntüsü a'dan z'ye olan karakterleri, soru işaretini, ünlemi, noktayı ya da alt çizgiyi yakalayacaktır.

💡
Karakter sınıfı içerisindeki tek özel karakterler kısa çizgi (-) ve şapka işaretidir (^). İleride göreceğimiz nokta, soru işareti gibi özel karakterler, karakter sınıfının içerisinde gerçek karakter (literal) olarak değerlendirilir.

Eğer kısa çizgi, karakter sınıfının içerisinde ilk eleman olarak yazılırsa, mantıken bir aralık belirtemeyeceği için gerçek karakter olarak algılanır. Örneğin:

[-a-z?.] => Bu regex örüntüsü kısa çizgiyi, a'dan z'ye olan karakterleri, soru işaretini ya da nokta işaretini yakalayacaktır.

Negatif Karakter Sınıfı

Karakter sınıflarının içerisinde özel anlamı olan ikinci karakterimiz, önceki derste gördüğümüz şapka ^ işaretidir. Ama buradaki vazifesi satır başı belirtmek değil.

Eğer [] yerine [^] kullanırsanız, bu regex örüntüsü, karakter sınıfının içerisinde olmayan bir karakteri yakalar.

Örneğin [^1-6] örüntüsü, 1'den 6'ya kadar olan rakamların dışındaki rakamları yakalar.

💡
Uyarı: ^ işareti yalnızca karakter sınıfının başında yer alıyorsa özel karakter olarak algılanır ve karakter sınıfını negatif yapar. Sınıfın içerisindeki başka bir indekste yer alıyorsa gerçek karakter olarak kabul edilir.

[^a-z] => Negatif karakter sınıfı (Alfabe dışındaki karakterleri yakalar. Rakamlar, özel karakterler vs.)

[a-z^] => Karakter sınıfı (a'dan z'ye olan karakterleri ya da ^ işaretini yakalar)