Regex Lazy Match, Lookahead ve Lookbehind

Merhaba, bu yazımda Regex’ de Lazy Match, Lookahead ve Lookbehind nasıl yapılır bunu anlatacağım.

Lazy Match

Regex’ te *(yıldız) ve +(artı) sembolleri varsayılan olarak aç gözlüdür(greedy, eager). Yani yakalayabildikleri kadar karakter yakalamaya çalışırlar. Fakat bu durum bazen işimize yaramayabilir. Bazen mümkün olduğunca en az eşleşmeyi elde etmek isteriz. İşte bunun için bu sembollerden sonra soru işareti “?” kullanmamız gerekmedir.

Bir örnek verecek olursak; (Bu arada ben örneğimi bir önceki yazımda olduğu gibi Visual Studio da oluşturduğum yeni bir web projesi üzerinden vereceğim.)

Elimizde aşağıdaki gibi bir kod parçası olduğunu varsayalım.

@Html.ValidationSummary(true, "", new { @class = "text-danger" })@("Burayı yakalama")

Şimdi sadece Html Helper’ı yakalamak istediğimizi düşünelim. @(“Burayı yakalama”) yazan yeri yakalamak istemediğimizi varsayalım. Bunun için bir önceki yazımda da belirttiğime benzer olarak ‘@Html\.ValidationSummary.+\)’ Regex’ ini kullanırsak göreceğiz ki Regex’ imiz bütün ifadeyi yakalıyor. Tıpkı aşağıda olduğu gibi;

Regex Greedy Match

Ama daha önce dediğimiz gibi biz eğer sadece Html Helper’ı yakalamak istiyorsak, @(“Burayı yakalama”) yazan yeri yakalamak istemiyorsak + sembolünün sonuna bir soru işareti koymamız gerekiyor.

Yani ifademizin son hali şöyle oldu: @Html\.ValidationSummary.+?\)

Regex Lazy Match

Gördüğünüz gibi sadece Html Helper’ı yakaladık. @(“Burayı yakalama”) yazan yer seçimimizin dışında kaldı.

Lookahead

Lookahead ler Regex’ de bir ifadeyi takip eden başka ifadeler olup olmadığını kontrol etmek için kullanılır. Negative ve positive olmak üzere ikiye ayrılır.

Negative Lookahead

Belirtilen bir ifade ile takip edilmeyen ifadeleri yakalamakta kullanılır. (?!ifade) şeklinde kullanılır. Örneğin, ardından b harfi gelmeyen bütün a harflerini yakala diyeceksek a(?!b) ifadesini kullanırız.

Şimdi bunu bir örnekle gösterecek olursak;

Yine formumuzdan sonunda a harfi olmayan bütün Html Helper’ları yakalayacağımızı varsayalım.(Ben önceden bazı Html Helperların sonuna a harfi koymuştum)

Regex Negative Lookahead

Gördüğünüz gibi ‘@Html\..+?\)(?!a)’ ifadesi sonunda a harfi olmayan bütün Html Helper’ ları yakaladı.

Positive Lookahead

Positive Lookahead de adından da anlaşılacağı üzere, Negative Lookahead’ in tam tersidir. (?=ifade) şeklinde kullanılır. Yani örnek verecek olursak; a harfinden sonra b harfi gelen bütün ifadeleri yakala demek için a(?=b) ifadesini kullanılırız.

Yukarıdaki örneğin tam tersi olan, sonu a ile biten Html Helper’ ları yakala demek için ‘@Html\..+?\)(?=a)’ ifadesini kullanırız. Sonuç aşağıdaki gibidir;

Regex Positive Lookahead

Lookbehind

Lookbehind’ lar bir ifadeden önce başka bir ifade olup olmadığını kontrol etmek için kullanılır. Negative ve Positive olmak üzere ikiye ayrılır.

Negative Lookbehind

Belirtilen ifade ile başlamayan ifadeleri kontrol etmek için kullanılır. (?<!ifade) şeklinde kullanılır. Örneğin; a harfinden önce b harfi olmayan bütün ifadeleri yakala demek için (?<!b)a ifadesi kullanılır

Örneğimizi daha da açacak olursak; Formumuzdaki Html Helper’ların bazılarının başına a harfi koydum. Gelin a ile başlamayanları yakalayalım.

İfademiz sizin de tahmin edeceğiniz üzere şöyle olacaktır;

‘(?<!a)@Html\..+?\)’

Regex Negative Lookbehind

Gördüğünüz gibi a harfi ile başlamayan bütün Html Helper’ ları yakalamış olduk.

Positive Lookbehind

Adından da tahmin edeceğiniz üzere, belirtilen ifade ile başlayan ifadeleri yakalamak için kullanılır. (?<=ifade) şeklinde kullanılır. Örneğin; b harfi ile başlayan bütün a harflerini yakala demek için (?<=b)a ifadesini kullanırız.

Hemen örneğimiz üzerinde deneyelim. İfademiz şu şekilde olacak;

‘(?<=a)@Html\..+?\)’

Regex Positive Lookbehind

Sonuç

Evet bu yazımda Lazy Match, Lookahead ve Lookbehind’ ı anlatmış oldum.

Kaynak olarak şu siteyi kullandım.

Herkese başarılar 🙂

Bir yorum bırakın