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)
Yapı
/....../flags
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.
Ş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.
/[a]/gmui
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
/aibc/gmui
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.
Aşağıdaki pattern ile sadece satır başındaki s karakterlerini seç dedik.
/^s/gmui
/^sö/gmui
Yukarıdaki pattern’i uyguladığımızda satır başından itibaren sö 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.
$ 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.
/,$/gmui
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.
[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.
/[a-zA-Z0-9]/gmui
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,
/[^a-z]/gmui
Ö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.
/./gmui
\ 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.
/\./gmui
\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.
/\s/gmui
/\S/gmui
\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.
/\w+/gmui
/\W+/gmui
\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.
/\d/gmui
/\D/gmui
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.
Tebrikler, Muzaffer Bey, emeginize saglik