Düzenli ifadeler nedir?
Düzenli ifadeler (veya Regex), belgelerde arama yapmak ve tam olarak aradığınız şeyle eşleşmek için tanımlayabileceğiniz metin kalıplarıdır. Bir karakter dizisinin bir modelle eşleştiğinden emin olan bir yapıdır.
Karakter Kümeleri
Bir dosyada veya metin bloğunda belirli bir dizeyi ararken, grep ‘string’ ile olduğu gibi arayabilirsiniz. Ancak metin kalıplarını aramak isterseniz ne olur? Örneğin, belirli bir harfle başlayan bir kelimeyi veya sayılarla biten herhangi bir kelimeyi arıyor olabilirsiniz. İşte burada düzenli ifadeler devreye girer.
Örnekler vermek gerekirse:
- [abc] a, b ve c ile eşleşecektir.
- [abc]zz, azz, bzz ve czz ile eşleşecektir.
- Aralıkları tanımlamak için tire işareti de kullanabilirsiniz.
[a-c]zz yukarıdaki ile aynıdır.
- [a-cx-z]zz düzenli ifadesi azz, bzz, czz, xzz, yzz ve zzz ile eşleşecektir.
- En önemlisi, bu herhangi bir alfabetik karakterle eşleşmek için kullanılabilir:
[a-zA-Z] herhangi bir tek harfle (küçük veya büyük) eşleşecektir.
- Sayıları da kullanabilirsiniz:
dosya[1-3] dosya1, dosya2 ve dosya3 ile eşleşecektir.
- Daha sonra, ^ sembolü ile bir karakter kümesinden karakterleri hariç tutmanın ve diğer her şeyi dahil etmenin bir yolu vardır.
[^k]ing ring, sing, $ing ile eşleşir, ancak king ile eşleşmez.
- Elbette, yalnızca tek karakterleri değil, karakter kümelerini de hariç tutabilirsiniz.
[^a-c]at fat ve hat ile eşleşir, ancak bat veya cat ile eşleşmez.
Aşağıdaki karakterlerin tümünü eşleştirin: c, o, g
[cog]
Aşağıdaki kelimelerin tümünü eşleştirin: cat, fat, hat
[cfh]at
Aşağıdaki kelimelerin tümünü eşleştirin: Cat, cat, Hat, hat
[CcHh]at
Aşağıdaki dosya adlarının tümünü eşleştirin: File1, File2, file3, file4, file5, File7, file9
[Ff]ile[1-9]
Soru 4’teki “File7” hariç tüm dosya adlarını eşleştirin (^ sembolünü kullanın):
[Ff]ile[^7]
Joker Karakterler ve Opsiyonel Karakterler
Herhangi bir tek karakterle (satır sonu hariç) eşleşmek için kullanılan joker karakter noktadır. Bu, a.c’nin aac, abc, a0c, a!c ve benzerleriyle eşleşeceği anlamına gelir.
Ayrıca, ? soru işaretini kullanarak ifadenizde bir karakteri isteğe bağlı olarak ayarlayabilirsiniz. Bu, c isteğe bağlı olduğu için abc? ifadesinin ab ve abc ile eşleşeceği anlamına gelir.
Not: Gerçek bir nokta aramak istiyorsanız, ters eğik çizgi (\) kullanmanız gerekir. Bu, a.c’nin a.c’nin yanı sıra abc, a@c vb. ile de eşleşeceği anlamına gelir. Ancak a\.c sadece a.c ile eşleşecektir.
Aşağıdaki kelimelerin hepsini eşleştirin: Cat, fat, hat, rat
.at
Aşağıdaki kelimelerin hepsini eşleştirin: Cat, cats
[Cc]ats?
Aşağıdaki alan adını eşleştirin: cat.xyz
cat\.xyz
Aşağıdaki alan adlarının tümünü eşleştirin: cat.xyz, cats.xyz, hats.xyz
[ch]ats?\.xyz
n’den z’ye kadar herhangi bir harfle bitmeyen her 4 harfli ifadeyi eşleştirin:
...[^n-z]
^ sembolü kullanarak bat,bats, hat,hats ile eşleştirin ama rat ve rats ile eşleşmesin.
[^r]ats?
Metakarakterler ve Tekrarlamalar
Daha büyük karakter kümelerini eşleştirmenin daha kolay yolları vardır.
Örneğin, \d herhangi bir tek rakamı eşleştirmek için kullanılır.
Örnekler:
- \d, 9 gibi bir rakamla eşleşir.
- \D rakam olmayan bir karakterle eşleşir, A veya @ gibi.
- \w bir alfasayısal (harf veya rakam) karakterle eşleşir, a veya 3 gibi
- \W alfasayısal olmayan bir karakterle eşleşir, ! veya # gibi
- \s bir boşluk karakteriyle eşleşir (boşluklar, sekmeler, satır sonları)
- \S diğer her şeyle eşleşir (alfasayısal karakterler ve semboller)
Örnek gösterimler:
- {12} – tam 12 kez.
- {1,5} – 1 ila 5 kez.
- {2,} – 2 veya daha fazla kez.
- * – 0 veya daha fazla kez.
- *- 1 veya daha fazla kez.
Aşağıdaki kelimeyi eşleştirin: catssss
cats{4}
Aşağıdaki sözcüklerin tümünü eşleştirin (* işaretini kullanın): cat, cats, catss
[Cc]ats*
Aşağıdaki cümlelerin tümünü eşleştirin (+ işaretini kullanın): regex go br, regex go brrrrrr
regex go br+
Aşağıdaki dosya adlarının tümünü eşleştirin: ab0001, bb0000, abc1000, cba0110, c0000 (metakarakter kullanmayın)
[abc]{1,3}[01]{4}
Aşağıdaki dosya adlarının tümünü eşleştirin: File01, File2, File12, File20, File99
[Ff]ile\d{1,2}
Aşağıdaki klasör adlarının tümünü eşleştirin: kali tools, kali tools
kali\s+tools
Aşağıdaki dosya adlarının tümünü eşleştirin: notes~, stuff@, gtfob#, lmaoo!
\w{5}\W
Tırnak içindeki dizeyi eşleştirin (* işaretini ve \s, \S metakarakterlerini kullanın): “2f0h@f0j0%! a)K!F49h!FFOK”
\S*\s*\S*
“!” işareti ile bitmeyen her 9 karakterli dizeyi (harfler, sayılar ve sembollerle) eşleştirin
\S{8}[^!]
Şu dosya adlarının tümünü eşleştirin (+ sembolünü kullanın): .bash_rc, .unnecessarily_long_filename ve note1
\.?\w+
Başlangıçlar ve Bitişler
Bazen bir satırın başında veya sonunda belirli bir düzene göre arama yapmak istediğimizi belirtmek çok yararlıdır. Bunu şu karakterlerle yaparız:
^ – ile başlar
$ – ile biter
Örneğin:
- abc ile başlayan bir satırı aramak istiyorsanız ^abc kullanabilirsiniz.
- xyz ile biten bir satırı aramak istiyorsanız xyz$ kullanabilirsiniz.
Not: ^ sembolü [köşeli parantez] içine alındığında bir karakter kümesini hariç tutmak için kullanılır, ancak olmadığında, bir kelimenin başlangıcını belirtmek için kullanılır.
Bir düzenli ifadede (parantez) içine alarak da gruplar tanımlayabilirsiniz. Bu fonksiyon, bu eğitimin kapsamı dışında kalan birçok şekilde kullanılabilir. Biz bunu bir ya/ya da kalıbı tanımlamak ve ayrıca kalıpları tekrarlamak için kullanacağız. Regex’te “veya” demek için | işaretini kullanırız.
Bir “ya/ya da” kalıbı örneği için, during the (day|night) kalıbı şu cümlelerin her ikisiyle de eşleşecektir: during the day ve during the night.
Bir tekrar örneği için, (no){5} ifadesi nonononono cümlesiyle eşleşecektir.
“Password:” ile başlayan ve ardından “0” hariç herhangi bir 10 karakter içeren her dizeyi eşleştirin
Password:[^0]{10}
Bir satırın başındaki “username: ” ile eşleştirin (boşluğa dikkat edin!):
^username:\s
Rakamla başlamayan her satırı eşleştirin (bir metakarakter kullanın):
^\D
Bu dizeyi bir satırın sonunda eşleştirin: EOF$
EOF\$$
Aşağıdaki cümlelerin tümünü eşleştirin:
- I use nano
- I use vim
I use (nano|vim)
$ ile başlayan ve ardından herhangi bir tek rakam gelen tüm satırları eşleştirin, ardından $, ardından bir veya daha fazla boşluk olmayan karakter ekleyin.
\$\d\$\S+
Olası tüm IPv4 IP adreslerini eşleştirin (metakarakterleri ve grupları kullanın):
(\d{1,3}\.){3}\d{1,3}
Kullanıcı adını ve alan adını (TLD değil) ayrı gruplar halinde ekleyerek bu e-postaların tümünü eşleştirin (\w kullanın): hello@tryhackme.com, username@domain.com, dummy_email@xyz.com
(\w+)@(\w+)\.com
Kendi regex’lerinizi denemeniz için regex101 sitesini tavsiye ederim.