Regular Expressions - Düzenli İfadeler

Rıdvan Kaplan
5 min readFeb 8, 2021

--

Merhaba !!!

Düzenli ifadeler kısaca regex‘ler bir arama modelini tanımlamak için özel bir metin dizesidir. Örneğin bir metinde arama yapacaksanız Ctrl+F ile kelime kelime arayabilirsiniz. Ama daha özel bir arama yapmak isterseniz regex’leri kullanabilirsiniz.

Regex karşınıza çok sık çıkmayabilir. Ama programlama, siber güvenlik vs. ile ilgileniyorsanız karşınıza en az birkaç defa çıkacaktır. Regex linux sistemlerde veya birçok programlama dilinde ( Örneğin php, java, python vs.) kullanılır. Farklı dillerde küçük farklılıklar olsa da aşağı yukarı hepsinde regex aynıdır.

Giriş yapmadan önce aslında linux kullanan herkes regex kullanmıştır. Ama isminin regex olduğunu bilmiyor olabilir. Örneğin dosyaları listeleyeceksiniz ama dosyanın devamını hatırlamıyorsunuz. Hepsini listelemek için * karakterini kullanırız.

Regex’in birçok özel karakteri vardır. Birçoğundan örnekler göstereceğim ama ayrıca sizinde denemenizi tavsiye ederim.

\d — Metindeki 0 ile 9 arasındaki rakamlardan herhangi birisini bulur.

. — Nokta herhangi bir karaktere yani rakam, harf, boşluk ve her şey için kullanılabilir. Eğer gerçek nokta karakterini kullanacaksanız \ ile özel olmasından kaçınabilirsiniz.

[abcz] — Köşeli parantez içerisinde harf belirterek eşleşme yapabiliriz. Örnekteki regex’te eğer metinde abcz harflerinden herhangi biri varsa eşleşme yapacaktır.

[^ab] — Köşeli parantez içerisinde ^ karakteri ile olumsuzluk verebiliriz. Örnekteki regex’te eğer metinde ab harflerinden herhangi birinden olmayanlarla eşleşme yapacaktır.

[a-dA-Z0–4] — Köşeli parantez içerisinde belirli harf veya sayı aralıkları verip eşleşme yapabiliriz. Örneğin a ile d arasında, A ile Z arasında veya 0 ile 4 arasında herhangi bir harf, sayı varsa eşleşme yapacaktır. Küçük büyük harf gördüğünüz üzere etkiliyor.

\w — Herhangi bir alfanümerik karakterleri eşleştirmemize yarar. Alfanümerik karakterler harfler, rakamlar olabilir. Burada ayrıca _ dahil edilmiştir. Yani [a-zA-Z0–9_] regex’inin kısaltılmış halidir.

{ } — Süslü parantezler içerisinde istediğimiz karakterin aralığını belirtebiliriz. Örneğin a{3,5}regex’inde a harfinden 3 ile 5 arasında olanları eşleştir gibi.

+ ve * karakterleri aşağı yukarı aynı görevi görür. İkisinde de önceki karakterin eşleştiği yere kadar eşleştirir. Örneğin normal de [a-f] tek bir karakteri eşleştirir bırakır. Ama [a-f]+ a ile f arasında herhangi bir karakter eşleşmeyene kadar devam edecektir. + ile * farkı ise + da en az 1 karakter eşleşmesi istenir. Ama * da bu istenmez. Yani hiçbir karakter eşleşmese de olur.

? — Soru işaretimiz de özel bir karakterdir. İsteğe bağlı karakter belirtmemize yarar. Örneğin ab?c regex’i abc veya ac karakterlerini eşleştirecektir. Eğer gerçek ? işaretini kullanmak isterseniz \?şeklinde kullanabilirsiniz.

\s — Whitespace karakterimizdir. Boşluk, tab veya yeni satır işlemlerinde ortak olarak kullanılır.

^ ve $ Eğer ^ karakteri [] içinde değil de dışında ise olumsuzluk anlamında değil belirttiğimiz karakter grubu satırın başında olmak zorunda anlamındadır. $ da tam tersidir. Belirttiği karakter grubu satırın sonunda olduğunda eşleşme yapacaktır. Örneğin ^Rıdvan Kaplan$ Satırın başı Rıdvan ile başlayan, arasında 1 boşluk olduktan sonra ve satırın sonu Kaplan ile biten kısımları eşleştirme yapacaktır.

\D \W \S — Özel karakterlerin büyük halleri ise tersi durumunu belirtir. Örneğin \d herhangi bir rakamı belirtir. \D ise rakam olmayan herhangi bir karakter.

() — Parantezler ile gruplama yapılabilir. Örnek aşağıda verilmiştir.

Parantez içerisinde ? kullanımı ile gruba isim verilebilir. (?<İsim>) şeklinde kullanımı vardır.

Birkaç örnek yapalım. Bir sitemiz var. Bize görevler veriyor ve çözmemiz isteniyor. Referans olarak kullandığım sitede siz de alıştırmalarınızı yapabilirsiniz. https://regexone.com/

Bu görevde 3 metin verilmiş. Hepsinin eşleşmesi sağlanacak bir regex yazılması istenmiş. Farklı yolları olsa da örneğin genel olarak .* şeklinde daha özel regex yazmamız gerekir. Örneğin [a-z\d\s”=]+ şeklinde.

Sıradaki görev de ilk 3 metin eşleşecek alttaki 3 metin ise eşleşmemesi isteniyor. Burada da[cmf]an şeklinde bir regex ile geçebiliriz.

Aynı şekilde burada da bazı metinlerin eşleşmemesi isteniyor. A ile C arasında herhangi bir karakter ve devamı alfanümerik olacak şeklinde yazdığımızda geçmiş oluyoruz.

Burada da wa karakteriyle başlayan, z karakterinden 3 ile 5 aralığı kadar olan ve devamı up ile biten metinleri eşleştiren regex’imizi yazıyoruz.

Burada + ile * ‘ın farkını kullanıyoruz. * boş olsa da eşleştirir ama + boş olduğunda eşleştirme yapmaz.

Regex’lerde gruplama kullanabiliriz. Gruplama şu işimize yarar. Örneğin .pdf uzantılı dosyaların isimlerini almamız gerekiyor. Normal \w+.pdf$ regex’i ile metni eşleştiririz. Ama dosyanın ismini alamayız. burada gruplama devreye giriyor ve işimizi görüyor. İstediğimiz kısımlara () içerisine aldığımızda gruplama işlemini yapıyoruz.

İç içe gruplama da yapabiliriz. Örnekteki gibi tarih’in tamamı ve sadece yıl’ı ayrı ayrı gruplandırabiliriz.

Birçok kişinin aşina olduğu mantıksal koşul olan veya‘yı gruplar içinde kullanabiliriz. | karakteriyle kullanılır.

Bir tane örnekte log üzerinden denedim. Örnek log kendi makineniz üzerinden veya internet üzerinden alabilirsiniz. Benim aldığım site https://www.sumologic.com/blog/apache-logs-vs-nginx-logs/

Yazdığım regex ve örnek log ektedir. https://paste.ubuntu.com/p/8cYGT3JW45/

Son kısımda kullandığım site http://regex101.com

Okuduğunuz için teşekkürler. Yazılarımda herhangi bir teknik hata varsa bildirmekten çekinmeyiniz…

Originally published at https://ridvankaplan.com.

--

--

Rıdvan Kaplan

Cyber Security & Blue Team | OSCP & eCTHPv2 & eCIR & CySA+