Kategoriler
Kodlama

Regex hakkında

Seveni, sevmeyeni, öğrenmek için Regex yani Düzenli İfadeler (Regular Expressions) hakkında her şey.

Regex Master Olmak, Web Geliştiricileri için Regex’e Giriş, Regex Cheat Sheet vs. ne varsa bir araya getirmeye çalıştım. Sevenler, sevmeyenler herkes için Regex(Regular Expressions/Düzenli İfadeler) hakkında her şey! 👀

Regex nedir?

Regex (Regular Expressions) Türkçeye çevirisi ile düzenli ifaderler veya kurallı ifadeler olarak çevirebiliriz, bilgisayar camiasında regex veya regexp olarak kısaltılmış olarak kullanılır. Regex kısaca; ele alınan metindeki kimi string/katar kısa yoldan ve esnek bir biçimde belirlenmesini sağlar. Bu string/katar belli karakterler, kelimeler veya karakter örüntüleri olabilir. Düzenli ifadeler, bir biçimsel dil kullanarak yazılır ve bir düzenli ifade işleyici tarafından yorumlanır. Bir düzenli ifade işleyici, ya ayrıştırıcı üreteci olarak hizmet eden ya da metni inceleyip verilen tarife uygun kısımlarını belirleyen bir programdır. Regex, yazılım sektöründe kullanılan en güçlü, yaygın olarak uygulanabilir ve çoğu zaman korkutucu tekniklerden biridir. Bir metin içerisinde kalıplar(patterns) kullanarak esnek arama yapmanızı sağlar. Bir başka deyişle, karakter dizilerini kullanarak karmaşık arama kalıplarını tanımlamanın bir yoludur. Modern Regex’in mucidi Amerikalı Matematikçi Stephen Cole Kleene’dır.

Neden Regex öğrenmeliyiz?

Regex, hemen hemen her programlama dilinde kullanılabilir.

  • DRY (don’t repeat yourself) prensibi ile geliştirme yaptığımız için,
  • Dosya isimlerinde toplu değişiklikler yapabilmek için,
  • Esnek ve karmaşık aramalar yapabilmek için,
  • Unix Shell ile etkileşime girebilmek için,
  • Favori metin editörünüzde kod aramak ve/veya yeniden düzenlemek için,
  • Veritabanında metin araması yapmak için,
  • Kullanıcı girişlerini doğrulamak (Input Validations) için,
  • Efektif Code Refactoring yapabilmek ve çok daha fazlası için regex öğrenmeliyiz.

Hızlı başlangıç

Temel kavramlar

Seçenekleme

Dikey bir çizgi seçenekleri ayırır. Örneğin “gr(a|e)y” olarak kısaltılabilecek olan “gray|grey” “gray” ya da “grey” ile eşleşir.

Gruplama

Parantezler işleçlerin (operatör) alan ve önceliklerini tanımlamak için kullanılır. Örneğin “gray|grey” ve “gr(a|e)y” değişik desenlerdir, ama her ikisi de gray ve grey’i içeren kümeyi tanımlar.

Niceleme

Bir karakter ya da grubun ardından gelen niceleyici öncesindeki ifadenin kaç kez görülebileceğini belirtir. En temel niceleyiciler ?, * ve +dır.:

  • ? – Soru işareti öncesindeki ifadenin 0 veya 1 kez geçtiğini gösterir. Örneğin “colou?r”, colour ve color`un her ikisi ile de eşleşir.
  • * – Asteriks, öncesindeki ifadenin 0, 1 veya herhangi bir sayıda olabileceğini gösterir. Örneğin “go*gle, ggle, gogle, google, gooogle…vb ile eşleşir.
  • + – Artı işareti öncesindeki ifadenin en az bir kez geçtiğini gösterir. Örneğin “go+gle”, gogle, google, gooogle, vb ile eşleşir (ama ggle ile eşleşmez).

Bu yapılar, tıpkı sayılar ve +, , *, / gibi işleçler ile cebirsel ifadeler oluşturulabileceği gibi rastgele karmaşık ifadeler yaratmak için birleştirilebilir.

KarakterSonuç/Kullanım
.Sayfa sonu veya paragraf sonu haricindeki herhangi bir karakteri temsil eder. Örneğin, “tak.im” arama terimi “takvim” ve “taksim” sonuçlarının ikisiyle de döner.
^Eğer terim sadece paragraf başında ise aranılan terimi bulur. Boş alanlar veya karaktere tutturulmuş çerçeveler gibi paragraf başındaki özel nesneler dikkate alınmaz. Örnek: “^Selma”.
$Eğer terim sadece paragraf sonunda ise aranılan terimi bulur. boş alanlar veya karaktere tutturulmuş çerçeveler gibi paragraf başındaki özel nesneler dikkate alınmaz. Örnek: “Selma$”.$ kendi başına bir paragrafın sonu ile eşleşir. Bu şekilde paragraf sonlarını bulup değişltirmek mümkün hale gelir..
*“*” karakterinin önündeki 0 veya daha fazla karakteri bulur. Örneğin, “Ab*c” finds “Ac”, “Abc”, “Abbc”, “Abbbc”, ve buna benzer.
+“+” karakterinin önündeki 1 veya daha fazla karakteri bulur. Örneğin, “AX.+4” arama terimi, “AXx4” veya “AXxyz4″metnini bulur, “AX4” metni bulunmaz.Paragraftaki arama dizisine uygun en uzun metin daima bulunur. Eğer paragraf “AX 4 AX4” metnini içeriyorsa, bu pasaj vurgulanır. “AX 4” kısımı değil.
?“?” karakterinin önündeki 0 veya daha fazla karakteri bulur. Örneğin, “Metal?” arama terimi, “Metal” ve “Meta” sonuçlarını bulur. “x(ab|c)?y” ifadesi “xy”, “xaby”, or “xcy” metinlerini bulur.
Arama, “” sonrasında girilen özel karakteri bir düzenli ifade olarak değil de bir normal karakter olarak işler (n, t, > ve < katışımları dışında). Örneğin, “ağaç.”, “ağaç.” ifadesini bulurken “ağaçlar” ya da “ağaçla” ifadelerini bulmaz.
nShift+Enter tuş kombinasyonu ile eklenmiş satır kesmesini temsil eder. Satır kesmesini, paragraf kesmesi olarak değiştirmek için Aranan ve Yeni değer kutucuklarına n’i girin ve ardından bir arama ve değiştirme gerçekleştirin.İçin ara metin kutusu içindeki n, Shift+Enter tuşları ile eklenmiş satır sonuna karşılık gelir.İle yerdeğiştir metin kutusundaki n, Enter veya Return tuşları ile girilebilen paragraf sonlarına karşılık gelir.
tBir tab (sekme) karakterini gösterir. Bu ifadeyi ayrıca Yeni değer kutusunda da kullanabilirsiniz.
bBir kelime sınırını eşleştir. Örneğin, “bbook” ifadesi “bookmark” ifadesini bulur ancak “checkbook” ifadesini bulmaz. Oysa “book” ifadesi “checkbook” ifadesini bulur ancak “bookmark” ifadesini bulmaz. Aranan kelime “book” her iki aramada da bulunur.
^$Boş paragrafları arar.
^.Bir paragraf başındaki ilk karakteri bulur.
& veya $0Aranankutusundaki arama ölçütüne göre bulunan metine, Değişiklik yaptığınız zaman, Yeni değer metin kutusunda belirlediğiniz metni ekler.Örneğin, eğer Aranan kutusunda “pencere” metnini girer ve Yeni değer kutusuna “& çerçevesi” metnini girerseniz, “pencere” metni “pencere çerçevesi” metni ile değiştirilecektir.Ayrıca, arama ölçütleriyle bulduğunuz metinlerin, Öznitelikleri’ni değiştirmek ya da bunları faklı bir Biçim ile kullanmak için de Yeni değer kutusuna bir “&” işareti girebilirsiniz.
[abc123]Köşeli ayraçlar arasındaki içindeki karakterleri bulur. Örneğin, s[eü]t ile, “set” ve “süt” sözcüklerini bulabilirsiniz.
[a-e]Başlangıç ve bitiş karakterlerini de içerecek şekilde, a ve e arasındaki karakterleri simgelerKarakterler kod numaralarına göre sıralanır.
[a-eh-x]a-e ve h-x arasındaki karakterleri bulur.
[^a-s]a ile s karakter aralığı dışındaki tüm karakterleri bulur. Örneğin “a[^a-k]ın” “alın” ve “atın” sözcüğünü bulabilir, ancak “akın” sözcüğünü bulamaz.
uXXXXUXXXXXXXXDört basamaklı onaltılık Unicode koda (XXXX) dayalı bir karakteri temsil eder.Belirsiz karakterler için büyük U ve sekiz tane on altılık basamaklı (XXXXXXXX) ayrı bir çeşidi vardır.Özel karakterler için belirli sembol yazı tipleri için kodlar kullanılan yazı tipine bağlı olabilir. Kodları, Ekle – Özel Karakter menü komutunu seçerek görüntüleyebilirsiniz.
|“|” öncesindeki ve “|” sonrasındaki terimleri bulur. Örneğin, “bu|şu”, “bu” ve “şu” terimlerini bulur.
{2}Başlangıç ayracının önündeki karakterin kaç kez tekrarlanacağını tanımlar. Örneğin, “sa{2}t” “saat” sözcüğünü bulur, ancak “sat” sözcüğünü bulmaz.
{1,2}Başlangıç ayracının önündeki karakterin veya ifadenin en az n kez yinelendiği yerlerde. Örneğin, “10{3,}” “1000”, “1000000” metinlerini bulur, ancak “100” bulunmaz.
{1,}Başlangıç ayracının önündeki karakterin veya ifadenin en az n kez yinelendiği yerlerde. Örneğin, “10{3,}” “1000”, “1000000” metinlerini bulur, ancak “100” bulunmaz.
( )Aranan kutusunda:Ayraç içindeki karakterleri başvuru olarak tanımlar. Geçerli ifadede ilk başvuruya “1” ile, ikinci başvuruya “2” gibi biçimlerde başvuruda bulunabilirsiniz.Örneğin, metniniz 13487889 sayısını içeriyorsa ve aramanız (8)711 düzenli ifadesini kullanıyorsa, “8788” sonucu bulunur.Parantezleri () terimleri gruplamak için kullanabilirsiniz; örneğin “a(bc)?d” ifadesi “ad” veya “abcd” ifadelerini bulacaktır.Yeni değer kutusunda:Başvuruları değiştirmek için (ters bölü) yerine $ (dolar) kullanın. Bulunan karakter dizisinin tümünü değiştirmek için $0 kullanın.
[:alpha:]Alfabetik karakterleri bulur. [:alpha:]+ alfabetik karakterlerden oluşan metin dizilerini bulur.
[:digit:]Tek basamaklı bir sayı bulur. Birden fazla basamaklı bir sayı bulmak için [:digit:]+ parametresini kullanın.
[:alnum:]Alfanimerik karakterleri ([:alpha:] ve [:digit:]) temsil eder.
[:space:]Boşluk karakterini bulur (sekme karakterleri, veya bölünemez boşluk karakterleri bulunmaz).
[:print:]Yazdırılabilir karakterleri bulur.
[:cntrl:]Yazdırılamayan karakterleri bulur.
[:lower:]Seçenekler alanında BÜYÜK/küçük harf duyarlı seçeneği işaretlendiyse, küçük harf karakterleri bulur.
[:upper:]Seçenekler alanında büyük/küçük harf duyarlılığı seçeneği işaretlendiyse, büyük harf karakterleri bulur.

Metacharacter

  • + En az bir kez veya daha fazla tekrarlı kullanım
  • - Aralık belirtmede kullanılır
  • * Hiç olmayabilir veya birden fazla tekrarlı kullanım
  • [ Karakter kümesi açma
  • ] Karakter kümesi kapama
  • { Tekrar sayısı kümesi açma
  • } Tekrar sayısı kümesi kapama
  • ^ Tersi, negatifi anlamındadır
  • Kaçış karakteri
  • ? Opsiyonel (0 veya 1 kez tekrarlı) kullanım
  • . Boşluk olmayan tüm karakterler
  • $ Satır sonu
  • | veya

Yukarıdaki karakterler regex söz dizimi (syntax) içerisinde kullanılan özel karakterlerdir. Eğer bu karakterlerden birini kalıp içinde kullanmak istersek karakteri ile kaçış yapabiliriz. Evet, sembolünü kullanmak için de aynı sembol ile kaçış yapmanız gerekir: \

Yazılmayan Karakterler

  • n satır sonu (new line)
  • r satır kesme (break)
  • t sekme boşluk (tab)
  • b kelime sınırı (word boundary)

Karakter Kümeleri

Karakter kümeleri bizim esnek arama yapmamızı sağlar. Örneğin bir içerikte bulunan tüm rakamları bulmak istiyoruz. Bunun için yapmamız gereken [0123456789] yazarak içerikteki rakamları aratabiliriz. Sadece rakamlar değil, harfleri (büyük küçük harf duyarlı olarak), özel karakterleri, kendi oluşturduğunuz bir kümeyi ya da bütün bunların dışında kalan tüm karakterleri karakter kümeleri ile esnek bir şekilde kolayca bulabilirsiniz.

  • [character_group ] character_group içindeki herhangi bir tek karakteri eşleştirir. Varsayılan olarak, eşleşme büyük / küçük harf duyarlıdır. Örnek: [oe] Volkan “o”, “a”
  • [^ character_group ] character_group içinde olmayan herhangi bir karakterle eşleşir. Varsayılan olarak, character_group içindeki karakterler büyük / küçük harf duyarlıdır. Örnek: [^ae] Volkan “V”, “l”, “a”, “n”
  • [first-last] Karakter aralığı: ASCII karakter tablosundaki iki karakter aralığındaki herhangi bir karakteri eşleştirir. Örnek: [A-Z] Volkan “N”
  • . Joker Karakter: n dışında herhangi bir karakterle eşleşir. Karakter kümesi içinde kaçış karakteri ile kullanılmalıdır. Örnek: k.n Volkan “kan”
  • w Herhangi bir sözcük karakteriyle (word) eşleşir. Örnek: [a-zA-Z0-9_]
  • W Sözcük olmayan herhangi bir karakterle eşleşir.
  • s Herhangi bir boşluk karakteriyle (white space) eşleşir.
  • S Boşluk olmayan herhangi bir karakterle eşleşir.
  • d Rakamlarla (digit) eşleşir. Örnek: d Volkan87 “8”, “7”
  • D Rakam olmayanlarla eşleşir. Örnek: Volkan87 “V”, “o”, “l”, “k”, “a”, “n”

Kısa Tanımlar

  • [0-9] yerine d sayı karakter kümesini ifade eder.
  • [^0-9] yerine D sayı olmayan karakter kümesini ifade eder.
  • [ tnrfv] yerine s boşlukları ifade eder, tam tersi için S
  • b kelime sınırı
  • [a-zA-Z0-9_] yerine w rakam, küçük harf, büyük harf ve “_” karakterlerinin tümünü ifade eder

ASCII Karakter Tablosu ve Kümeleri

  • [a-z][A-Z][0-9] ya da kısaca [a-zA-Z0-9]
  • [a-Z] çalışmaz, çünkü ascii tablosunda Z karakteri a’dan önce gelir.
  • [A-z] çalışır, ancak arada başka karakterleri de kapsayacağı için tercih edilmez.
  • [ase?,] sadece bu 5 karakterden oluşan bir karakter kümesidir.
  • [ ] ^ kaçış karakteri olmadan karakter kümesine dahil edilemez. Çünkü [ ] zaten karakter kümesini ifade eder. ^ ise değildir (tersi) anlamına gelir.

Tekrar Sayısı

  • ? – opsiyonel (0 veya 1 kez) kullanım.
  • + – en az bir kez veya daha fazla kullanım.
  • * – hiç olmayabilir veya birden fazla kullanım.

Kullanışlı Regex Kalıpları

Tarih Formatı (dd/mm/yyyy)

/^(0?[1-9]|[12][0-9]|3[01])([ /-])(0?[1-9]|1[012])2([0-9][0-9][0-9][0-9])(([ -])([0-1]?[0-9]|2[0-3]):[0-5]?[0-9]:[0-5]?[0-9])?$/

24 Saatlik Zaman Formatı

/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/

Hex Renk Değeri

/^#?([a-fA-F0-9]{6}|[a-fA-F0-9]{3})$/

Web developerlar için 30 kullanışlı regex kalıbı

Password Strength

^(?=.*[A-Z].*[A-Z])(?=.*[!@``#$&*])(?=.*[0-9].*[0-9])(?=.*[a-z].*[a-z].*[a-z]).{8}$

Hexadecimal Color

\``#([a-fA-F]|[0-9]){3, 6}

Validate E-mail Address

/[A-Z0-9._%+-]+@[A-Z0-9-]+.+.[A-Z]{2,4}/igm

IPv4 Address

/\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b/

IPv6 Address

(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))

Thousands Separator

/\d{1,3}(?=(\d{3})+(?!\d))/g

Prepend HTTP to Hyperlink

if` `(!s.match(/^[a-zA-Z]+:\/\``//))``{``  ``s = ``'http://'` `+ s;``}

Pull Domain from URL

/https?:\/\/(?:[-\w]+\.)?([-\w]+)\.\w+(?:\.\w+)?\/?.*/i

Sort Keywords by Word Count

^[^\s]*$   matches exactly 1-word keyword``^[^\s]*\s[^\s]*$  matches exactly 2-word keyword``^[^\s]*\s[^\s]*   matches keywords of at least 2 words (2 and more)``^([^\s]*\s){2}[^\s]*$  matches exactly 3-word keyword``^([^\s]*\s){4}[^\s]*$  matches 5-words-and-more keywords (longtail)

Find a Valid Base64 String in PHP

\?php[ \t]eval\(base64_decode\(\'(([A-Za-z0-9+/]{4})*([A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?){1}\'\)\)\;

Valid Phone Number

^\+?\d{1,3}?[- .]?\(?(?:\d{2,3})\)?[- .]?\d\d\d[- .]?\d\d\d\d$

Leading & Trailing Whitespace

^[ \s]+|[ \s]+$

Pull Image Source

\< *[img][^\>]*[src] *= *[\"\']{0,1}([^\"\'\ >]*)

Validate Date in DD/MM/YYYY Format

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

YouTube Video ID Match

/http:\/\/(?:youtu\.be\/|(?:[a-z]{2,3}\.)?youtube\.com\/watch(?:\?|``#\!)v=)([\w-]{11}).*/gi

Valid ISBN

/\b(?:ISBN(?:: ?| ))?((?:97[89])?\d{9}[\dx])\b/i

Check Zip Code

^\d{5}(?:[-\s]\d{4})?$

Valid Twitter Username

/@([A-Za-z0-9_]{1,15})/

Credit Card Numbers

^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})$

Find CSS Attributes

^\s*[a-zA-Z\-]+\s*[:]{1}\s[a-zA-Z0-9\s.``#]+[;]{1}

Strip HTML Comments

<!--(.*?)-->

Facebook Profile URL

/(?:http:\/\/)?(?:www\.)?facebook\.com\/(?:(?:\w)*``#!\/)?(?:pages\/)?(?:[\w\-]*\/)*([\w\-]*)/

Check version of Internet Explorer

^.*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/[5-9]\.0).*$

Extract Price

/(\$[0-9,]+(\.[0-9]{2})?)/

Parse E-mail Header

/\b[A-Z0-9._%+-]+@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}\b/i

Match a Particular Filetype

/^(.*\.(?!(htm|html|class|js)$))?[^.]*$/i

Match a URL String

/[-a-zA-Z0-9@:%_\+.~``#?&//=]{2,256}\.[a-z]{2,4}\b(\/[-a-zA-Z0-9@:%_\+.~#?&//=]*)?/gi

Append rel=”nofollow” to Links

(<a\s*(?!.*\brel=)[^>]*)(href=``"https?://)((?!(?:(?:www\.)?'.implode('|(?:www\.)?', $follow_list).'))[^"``]+)"((?!.*\brel=)[^>]*)(?:[^>]*)>

Media Query Match

/@media([^{]+)\{([\s\S]+?})\s*}/g

Google Search Syntax

/([+-]?(?:``'.+?'``|``".+?"``|[^+\- ]{1}[^ ]*))/g

Daha fazla bilgi

Kaynaklar:

Regex için online araçlar

Videolar

Regular Expressions (RegEx) in 100 Seconds
Regular Expressions (Regex) Tutorial: How to Match Any Pattern of Text
Yeni Başlayanlar İçin Düzenli İfadeler (RegEx – Regular Expressions)
Learn Regex (Regular Expressions) In Under 12 Minutes
Regex ile ilgili temel kavramlar // Kemal Ogün Işık // 25 Mayis 2017
Regular Expressions (RegEx) Tutorial #1 – What is RegEx?

Diğer makaleler

Umarım Regex hakkında yaptığım bu derleme işinize yarar, kolay gelsin 👍