Regex, RegExp, Regular Expressions (Düzenli/Kurallı İfadeler) – Bölüm 1

Regex’e Giriş

Bugün birçok programcının ve hatta veri işleyen herkesin kurtarıcısı olan sayısal ve dizgesel içeriklerde belirli kurallara uyan bölümleri bulan ifadelerden yani Düzenli/Kurallı İfadelerden (Regex/RegExp/Regular Expressions) bahsedeceğiz.

Amerikalı matematikçi Stephen Cole Kleene tarafından 1950’li yıllarda tasarlanan bu kavram günümüzde oldukça yaygın olarak birçok işletim sistemi temelinde ve programlama dilinde entegre olarak gelmektedir.

Bir metin dizisi (string) içerisinde belirlediğimiz düzen/kurallar (pattern) ile eşleşenleri döndüren oluşumdur kısaca.

  • Metin dizisi (string) – Arama yapılacak metin
  • Düzen/kural (pattern) – Arama için kullanılacak kalıplar
  • Eşleşen – Metin içerisinde düzenlere uyan sonuçlar (tekil ya da grup olabilir)
Ufak bir hatırlatma
Düzenli ifadelere makale boyunca kısaca regex, arama yapılacak metine string, kurala da pattern diyeceğim. Yukarıda da dediğim gibi bir çok işletim sistemi ve programlama diline entegre edildiğinde kullanımı farklılık göstermektedir. Başlıca kullanım şekilleri PCRE, ECMAScript, Python, Golang diyebiliriz. Ben aktif olarak C tabanlı diller  (Perl, PHP, C++, C# vb.) kullandığım için PCRE (Perl Compatible Regular Expressions) ile makaleme devam edeceğim. Diğer diller için ufak tefek değişiklikler ile sorunsuz çalışacaktır.

Yapı

Regex yukarıda görülen bir yapıda yazılır. / başlangıç karakteri ile / bitiş karakteri arasına pattern, bitiş karakterinden sonra ise bayraklar (flags) yazılır.

Bayraklar (flags)

Flags regex’in hangi arama kurallarına uyacağını belirlememizi sağlar. Aşağıda bu bayraklardan en sık kullanılanlar listelenmiştir.

Flag Adı Açıklama
g global İlk eşleşmeden sonra devam et
m multiline String sonuna kadar kontrol et, satır sonlarını görmezden gel
i insensitive Büyük/küçük harf duyarsız
x extended Beyaz boşlukları (white spaces) görmezden gel
s single line Nokta (.) pattern’i yeni satır karakterini de içerir
u unicode Tüm unicode karakterleri içer (ğüşıöç私ひらがな vb)

Yapıda da bahsettiğimiz gibi bayraklar yapının bitiş karakterinden sonra yazılır. En sık kullanılan bayrak dizilimi gmui ile bir çok işlemi rahatlıkla yapabilirsiniz. Bizde örneklerimizde gmui bayraklarını kullanacağız.

Düzenli/Kurallı İfadeler (pattern)

Evet… gelelim işin en caf caflı kısmına. Regex pattern’leri ilk başta çok karışık gelebilir. Fakat biraz pratik ile kurallara uyduğunuz sürece sizin de göreceğiniz gibi aslında çok basittir.

Regular Expressions Fun

Şimdi pattern’leri incelemeye başlayalım. Tabi regex uygulayabilmemiz için bize bir string gerekmekte. Bu sebepten string olarak Mehmet Akif ERSOY’un yazdığı milli marşımız olan İstiklal Marşı’nı kullanacağım.

[…] Tekil karakter seçimi

Regex’te köşeli parantez içerisine yazılan her karakter string içerisinde ayrı ayrı aranıp bize döndürülür.

Örneğin a karakterini verdiğimizde bize 170 adet bulunduğu bilgisi dönmektedir.

Regex 1

Dikkatinizi çekti ise küçük a harfini vermemize rağmen büyük A harfini de bize döndürdü. Sebebi i flag’ını vermemiz. Yani büyük küçük harf duyarsız demiştik.

aicb karakterlerini verirsek bize 331 adet bulunduğu bilgisi dönmektedir

Regex 2

Dikkatiniz çekti ise köşeli parantez içerisine yazılan her karakteri tek tek aradı ve bize döndürdü. Fakat dikkatli bakılırsa verdiğimiz karakterlerden i karakterinin büyük halini yani İ yi seçmedi. Çünkü İngilizce’de bildiğiniz gibi küçük i nin büyük hali I dır. Kural yazarken buna dikkat etmemiz gerekmektedir.

^ Satır başından seçme

Regex pattern’inde ^ karakteri satır başından anlamına gelir.

Dikkat
^ pattern’i ile [^] pattern’i farklı anlamdadır.

Aşağıdaki pattern ile sadece satır başındaki s karakterlerini seç dedik.

Regex 3

 

Yukarıdaki pattern’i uyguladığımızda satır başından itibaren karakterlerini içerenleri seç demiş olduk. Burada dikkat edilmesi gereken şey köşeli parantezde olduğu gibi her karakter ayrı ayrı aranmadan birlikte aranmaktadır. Yani buradan çıkarılacak sonuç köşeli parantez bir dizi karakterin her birini ayrı ayrı ararken kullanılmadığında birlikte aranmaktadır.

 

Regex 4

$ Satır sonundan seçme

Aynı ^ karakterinde olduğu gibi $ karakteri de satır sonunu ifade eder. Tabi sonu olduğu için aramak istediğimiz karakterleri önüne yazarız.

Yukarıdaki pattern’de string’teki satır sonundan önceki virgülleri seçiyoruz. Farkında iseniz string içinde bir çok virgül bulunmakta ama bize sadece satır sonundaki virgüller dönüyor.

Regex 5

[a-zA-Z0-9] Aralık (Range) seçme

Yukarıda köşeli parantez içine yazılan her karakter tek tek aranır demiştik. Köşeli parantez için aralıklarda tanımlayabiliriz. a-z dediğimizde ascii tablodaki a ve z harfleri arasındaki tüm ascii karakterler anlamına gelir, A-Z ise aynısının büyük harfleri için geçerlidir. insensitive bayrağı seçili ise a-z ile A-Z arasında bir fark olmayacaktır. Çünkü büyük küçük harf duyarsız çalışır. 0-9 dediğimizde de 0 ile 9 arasındaki herhangi bir rakam seçilir. Bunları tek tek yazabileceğimiz gibi başlıkta olduğu gibi yan yana da yazabiliriz.

Dikkat
a-z yada A-Z dediğimizde ascii bu aralıktaki karakterler dediğimiz için unicode karakterler bunun içine girmez. Yani Türkçe karakterler dahil değildir.
 

Regex 6

Yukarıda ^ ile [^] farklı olduğundan bahsetmiştik. Köşeli parantez içinde yazılan ^ karakteri programcılıktaki not anlamındadır. Yani dahil değil demektir. Örnekle açıklarsak,

Regex 7

Örnekte de görüleceği gibi a-z aralığındaki karakterler haricinde ne varsa (beyaz boşluklar dahil) seçti.

. (nokta) tek karakter seçme

Nokta karakteri herhangi bir karakter (beyaz boşluk dahil) demektir. Sadece . kullanarak bir pattern yazarsam string içindeki tüm karakterleri tek tek seç demiş olurum.

Regex 8

Dikkat
. ve [.] farklı şeylerdir. . (nokta) tüm karakterleri işaretlerken [.] sadece nokta karakterini işaretle demektir. Yani köşeli parantez içine yazılan karakterler özel anlam içeremez.

\ Ters slaş kaçış (escape) karakteri

Regex pattern’lerinde anlam ifade eden karakterleri kullanmak istediğimizde örneğin sadece . (nokta)‘ları seçmek istediğimizde /./gmui dersek nokta karakterinin özel anlamı olan herhangi bir karakteri seç demiş oluruz. Bu durumda bu özel karakterin anlamını yok etmek için \ (ters slaş) kaçış karakteri kullanılır.

Regex 9

\s \S Beyaz boşluk seç(me)me

Regex pattern’inde \s bize tüm beyaz boşlukları (white space) seç demektir. \S ise beyaz boşluklar haricinde ne varsa seç demektir.

Regex 10

Regex 11

\w+ \W+ Kelime (Word) seç(me)me

Regex pattern’inde \w string içerisindeki beyaz boşlukla ayrılmış her bir kelimeyi verir. [a-zA-Z0-9] ve tüm unicode karakterleri içerir. Noktalama işaretleri buna dahil değildir. \W ise tam tersini yani geri kalanları seçer. Bunlar beyaz boşluklar ve noktalama işaretleri denilebilir. Burada + (artı) işaretini görmektesiniz. Aşağıda detaylıca anlatılacaktır. Aslında /w herhangi bir [a-zA-Z0-9] ve tüm unicode karakter demektir. + işareti ile farklı bir karakter denk gelene kadar seçimi birleştir demekteyiz.

Regex 12

 

Regex 13

\d \D Rakam (Digit) seç(me)me

Regex pattern’inde \d string içerisinde [0-9] aralığında herhangi bir rakamı seç demektir. \D ise yine tam tersi anlamda [0-9] aralığı haricinde herhangi bir karakteri seç demektir. Burada da yine yukarıda olduğu gibi + (artı) kullanılabilir.

İstiklal Marşı’nda rakam olmadığından başlığın üstüne rakamlardan oluşan bir string ekliyorum.

Regex 14

 

Regex 15

Böylece Regex konusunun ilk bölümünün sonuna gelmiş bulunmaktayız. Bundan sonraki makalede regex ile gruplama işlemlerine ve gerçek dünyadan örneklerle konuyu pekiştirmeye çalışacağız.

Kaynak & İleri Okuma ve Araçlar

Bir Cevap Yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.