Düzenli ifadeler, metinde arama ve deÄiÅtirme yapmak için etkili bir yöntem saÄlayan kalıplardır.
JavaScriptâte, RegExp nesnesi aracılıÄıyla kullanılabilirler ve ayrıca string metotlarına entegre edilmiÅlerdir.
Düzenli İfadeler
Bir düzenli ifade (âregexpâ veya sadece âregâ) bir kalıp ve isteÄe baÄlı iÅaretlerden oluÅur.
Düzenli ifade nesnesi oluÅturmak için kullanılabilecek iki sözdizimi vardır.
Uzun olan sözdizimi:
regexp = new RegExp("kalıp", "iÅaretler");
Ve bölme iÅareti â/â kullanan kısa olanı:
regexp = /kalıp/; // iÅaret yok
regexp = /kalıp/gim; // g, m ve i iÅaretleriyle birlikte (yakında ele alınacak)
Bölme iÅaretleri /.../ JavaScriptâe düzenli bir ifade oluÅturduÄumuzu söyler. Aynı tırnak iÅaretlerinin String oluÅturduÄumuzu söylediÄi gibi.
Her iki durumda da regexp, RegExp sınıfının bir örneÄi oluÅturulmuÅ olur.
Bu ikisi arasındaki temel fark, bölme iÅareti /.../ kullanan modelin kalıba expression eklenmesine izin vermemesidir (${...} kullanan string Åablonları gibi). Tamamen statiktirler.
Bölme iÅaretleri, kod yazarken düzenli ifadeyi önceden bildiÄimizde kullanılır â ve bu en yaygın durumdur. new RegExp ise, dinamik olarak oluÅturulan bir stringâden anında bir regexp oluÅturmamız gerektiÄinde daha sık kullanılır. ÃrneÄin:
let tag = prompt("Hangi tag'i bulmak istiyorsun?", "h2");
let regexp = new RegExp(`<${tag}>`); // yukarıdaki prompt'a "h2" cevabı verildiyse, /<h2>/ ile aynı olur.
İÅaretler
Düzenli ifadelerde aramayı etkileyen iÅaretler olabilir.
JavaScriptâte bunlardan sadece 6 tanesi var:
i- Bu iÅaretle arama, büyük/küçük harfe duyarlı deÄildir:
Aveaarasında fark yoktur (aÅaÄıdaki örneÄe bakın). g- Bu iÅaretle arama, tüm eÅleÅenleri arar. EÄer g iÅareti yoksa, sadece ilk eÅleme döndürülür.
m- Ãok satırlı mod (Multiline mode of anchors ^ $, flag "m" bölümünde ele alınmıÅtır).
s- Yeni satır karakteri
\nile eÅleÅmek için noktaya.izin veren âdotallâ modunu etkinleÅtirir. (Karakter Sınıfları bölümünde ele alınmıÅtır). u- Tam unicode desteÄini etkinleÅtirir. Bu iÅaret, vekil çiftlerin doÄru iÅlenmesini saÄlar. Bununla ilgili daha fazla bilgi Unicode: flag "u" and class \p{...} bölümünde.
y- âYapıÅkanâ mod: metindeki tam pozisyonu arar (Sticky flag "y", searching at position bölümünde ele alınmıÅtır)
Buradan itibaren renk Åeması Åu Åekilde olacak:
- regexp â
red - string (aradıÄımız yer) â
blue - sonuç â
green
Arama: str.match
Daha önce de belirtildiÄi gibi, düzenli ifadeler string metotlarına entegre edilmiÅtir.
str.match(regexp) metodu regexp ile str stringindeki tüm eÅleÅmeleri bulur.
3 çalıÅma modu vardır:
-
Düzenli ifadede
giÅareti varsa, tüm eÅleÅmelerden oluÅan bir dizi döndürür:let str = "We will, we will rock you"; alert( str.match(/we/gi) ); // We,we (eÅleÅen 2 string'den oluÅan bir dizi)Hem
Wehem deweânin bulunduÄuna dikkat edin, çünküiiÅareti aramayı büyük/küçük harfe duyarsız hale getirir. -
EÄer
giÅareti yoksa, yalnızca ilk eÅleÅmeyi döndürür. Dönen ifade bir dizi formundadır. İlk eÅleÅme dizininin0indeksinde yer alır ve dizinin bazı ek ayrıntılar saÄlayan propertyâleri vardır:let str = "We will, we will rock you"; let result = str.match(/we/i); // g iÅareti olmadan alert( result[0] ); // We (ilk eÅleÅme) alert( result.length ); // 1 // Details: alert( result.index ); // 0 (eÅlemenin string'deki pozisyonu) alert( result.input ); // We will, we will rock you (kaynak string)Düzenli ifadenin bir kısmı parantez içine alınmıÅsa dizinin
0dıÅında baÅka indeksleri de olabilir. Bunu, Capturing groups bölümünde ele alacaÄız. -
Son olarak, eÅleÅme yoksa
nulldöndürülür (giÅareti olup olmadıÄı önemli deÄildir).Bu çok önemli bir nüans. EÅleÅme yoksa boÅ bir dizi almıyoruz, bunun yerine
nullalıyoruz. Bunu unutmak hatalara neden olabilir, örneÄin:let matches = "JavaScript".match(/HTML/); // = null if (!matches.length) { // Error: Cannot read property 'length' of null alert("Yukardaki satırda hata var"); }Sonucun her zaman bir dizi olmasını istiyorsak, bunu Åu Åekilde yazabiliriz:
let matches = "JavaScript".match(/HTML/) || []; if (!matches.length) { alert("EÅleÅme yok"); // Åimdi çalıÅıyor }
Yer deÄiÅtirme: str.replace
str.replace(regexp, yeni_str) metodu, string strâde regexp kullanılarak bulunan eÅleÅmeleri yeni_str ile deÄiÅtirir (g iÅareti varsa tüm eÅleÅmeler, aksi takdirde yalnızca ilk olanı).
ÃrneÄin:
// no flag g
alert( "We will, we will".replace(/we/i, "I") ); // I will, we will
// with flag g
alert( "We will, we will".replace(/we/ig, "I") ); // I will, I will
İkinci argüman, yeni_str bulunan eÅlemenin yerine geçen stringâdir. EÅleÅmenin parçalarını eklemek için özel karakter kombinasyonları kullanabiliriz:
| Semboller | DeÄiÅtirilen yeni_strâde yapılan eylem |
|---|---|
$& |
tüm eÅleÅmeyi ekler |
$` |
stringâin eÅleÅmeden önce gelen kısmını ekler |
$' |
stringâin eÅleÅmeden sonra gelen kısmını ekler |
$n |
n 1-2 basamaklı bir sayıysa, n. parantezlerin içeriÄini ekler, bununla ilgili daha fazla bilgi Capturing groups bölümünde |
$<isim> |
isim adı verilen parantezlerin içeriÄini ekler, daha fazlası Capturing groups bölümünde |
$$ |
$ karakterini ekler |
$& ile bir örnek::
alert( "I love HTML".replace(/HTML/, "$& and JavaScript") ); // I love HTML and JavaScript
Test: regexp.test
regexp.test(str) metodu en az bir eÅleÅme arar, eÅleÅme bulunursa true deÄerini döndürür, aksi takdirde false deÄerini döndürür.
let str = "I love JavaScript";
let regexp = /LOVE/i;
alert( regexp.test(str) ); // true
Bu bölümün ilerleyen kısımlarında düzenli ifadeler üzerinde daha fazla çalıÅacaÄız, daha fazla örnek üzerinde duracaÄız ve diÄer metotlarla da karÅılaÅacaÄız.
Metotlar hakkında tam bilgi Methods of RegExp and String makalesinde verilmiÅtir.
Ãzet
- Düzenli ifade bir kalıp ve isteÄe baÄlı iÅaretlerden oluÅur:
g,i,m,u,s,y. - İÅaretler ve özel semboller olmadan (daha sonra inceleyeceÄiz) düzenli ifadelerle arama bir substring aramasıyla aynıdır.
str.match(regexp)metodu eÅleÅmeleri arar:giÅareti varsa tümü, aksi takdirde yalnızca birincisini döner.str.replace(regexp, yeni_str)metodu,regexpkullanılarak bulunan eÅleÅmeleriyeni_strile deÄiÅtirir:giÅareti varsa tümünü, aksi takdirde yalnızca ilkini deÄiÅtirir.regexp.test(str)metodu en az bir eÅleÅme varsatruedeÄerini döndürür, aksi takdirdefalsedeÄerini döndürür.
Yorumlar
<code>kullanınız, birkaç satır eklemek için ise<pre>kullanın. EÄer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)