|
| 1 | +# Karakter Sınıfları |
| 2 | + |
| 3 | +Size pratik bir görev verildiğini düşünün -- `"+7(903)-123-45-67"` gibi bir telefon numaramız var, ve bunu sadece sayılara dönüştürmemiz gerekiyor: `79035419441`. |
| 4 | + |
| 5 | +Bunu yapmak için sayı olmayan herhangi bir şeyi bulabilir ve kaldırabiliriz. Karakter sınıfları bu konuda yardımcı olabilir. |
| 6 | + |
| 7 | +*Karakter sınıfı*, belirli bir kümedeki herhangi bir sembolle eşleşen özel bir gösterimdir. |
| 8 | + |
| 9 | +Başlangıç için "rakam" sınıfını keşfedelim. `pattern:\d` olarak yazılır ve "herhangi bir tek basamağa" karşılık gelir. |
| 10 | + |
| 11 | +Örneğin, telefon numarasındaki ilk haneyi bulalım: |
| 12 | + |
| 13 | +```js run |
| 14 | +let str = "+7(903)-123-45-67"; |
| 15 | + |
| 16 | +let regexp = /\d/; |
| 17 | + |
| 18 | +alert( str.match(regexp) ); // 7 |
| 19 | +``` |
| 20 | + |
| 21 | +`pattern:g` işareti olmadan, düzenli ifade yalnızca ilk eşleşmeyi arar, yani ilk `pattern:\d` rakamını arar. |
| 22 | + |
| 23 | +Tüm rakamları bulmak için `pattern:g` işaretini ekleyelim: |
| 24 | + |
| 25 | +```js run |
| 26 | +let str = "+7(903)-123-45-67"; |
| 27 | + |
| 28 | +let regexp = /\d/g; |
| 29 | + |
| 30 | +alert( str.match(regexp) ); // eşleşenler dizisi: 7,9,0,3,1,2,3,4,5,6,7 |
| 31 | + |
| 32 | +// bunlardan sadece rakamlardan oluşan telefon numarası yapalım: |
| 33 | +alert( str.match(regexp).join('') ); // 79035419441 |
| 34 | +``` |
| 35 | + |
| 36 | +Bu rakamlar için bir karakter sınıfıydı. Başka karakter sınıfları da var. |
| 37 | + |
| 38 | +En çok kullanılanlar: |
| 39 | + |
| 40 | +`pattern:\d` ("d" İngilizce "digit" kelimesinden geliyor) |
| 41 | +: Bir rakam: `0`'dan `9`'a bir karakter. |
| 42 | + |
| 43 | +`pattern:\s` ("s" İngilizce "space" kelimesinden geliyor) |
| 44 | +: Bir boşluk sembolü: boşluklar, tablar `\t`, yeni satırlar `\n` ve `\v`, `\f`, `\r` gibi nadir karakterleri içerir. |
| 45 | + |
| 46 | +`pattern:\w` ("w" İngilizce "word" kelimesinden geliyor) |
| 47 | +: Kelime karakteri: Latin alfabesinde bir harf ya da bir rakam ya da alt çizgi `_`. Latince olmayan harfleri kapsamaz (Kiril veya Hintçe gibi). |
| 48 | + |
| 49 | +Örneğin, `pattern:\d\s\w` bir rakam, ardından bir boşluk sembolü ve onun ardından bir kelime karakteri anlamına gelir, `match:1 a` gibi. |
| 50 | + |
| 51 | +**Düzenli ifadeler hem normal semboller hem de karakter sınıfları içerebilir.** |
| 52 | + |
| 53 | +Örneğin, `pattern:CSS\d`, ardından bir rakam gelen `match:CSS` ile eşleşir: |
| 54 | + |
| 55 | +```js run |
| 56 | +let str = "Is there CSS4?"; |
| 57 | +let regexp = /CSS\d/ |
| 58 | + |
| 59 | +alert( str.match(regexp) ); // CSS4 |
| 60 | +``` |
| 61 | + |
| 62 | +Ayrıca birçok karakter sınıfını aynı anda kullanabiliriz: |
| 63 | + |
| 64 | +```js run |
| 65 | +alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5' |
| 66 | +``` |
| 67 | + |
| 68 | +Eşleşme (her karakter sınıfı, ona karşılık gelen bir karaktere sahip): |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +## Ters sınıflar |
| 73 | + |
| 74 | +Her karakter sınıfı için aynı harfle gösterilen, ancak büyük harfle yazılmış bir "ters sınıf" vardır. |
| 75 | + |
| 76 | +"Ters", diğer tüm karakterlerle eşleştiği anlamına gelir, örneğin: |
| 77 | + |
| 78 | +`pattern:\D` |
| 79 | +: Rakam olmayan: `pattern:\d` hariç herhangi bir karakter, örneğin bir harf. |
| 80 | + |
| 81 | +`pattern:\S` |
| 82 | +: Boşluk olmayan: `pattern:\s` hariç herhangi bir karakter, örneğin bir harf. |
| 83 | + |
| 84 | +`pattern:\W` |
| 85 | +: Kelime karakteri olmayan: `pattern:\w` hariç herhangi bir karakter, yani Latin olmayan bir karakter veya boşluk sembolü. |
| 86 | + |
| 87 | +Bu bölümün başlangıcında, `subject:+7(903)-123-45-67` gibi bir string'den, yalnızca numaralardan oluşan telefon numarasının nasıl yapıldığını gördük: tüm rakamları bul ve birleştir. |
| 88 | + |
| 89 | +```js run |
| 90 | +let str = "+7(903)-123-45-67"; |
| 91 | + |
| 92 | +alert( str.match(/\d/g).join('') ); // 79031234567 |
| 93 | +``` |
| 94 | + |
| 95 | +Alternatif, daha kısa bir yol, rakam olmayan `pattern:\D` karakterleri bulmak ve bunları dizeden kaldırmaktır: |
| 96 | + |
| 97 | +```js run |
| 98 | +let str = "+7(903)-123-45-67"; |
| 99 | + |
| 100 | +alert( str.replace(/\D/g, "") ); // 79031234567 |
| 101 | +``` |
| 102 | + |
| 103 | +## Nokta "herhangi bir karakter"tir |
| 104 | + |
| 105 | +Nokta `pattern:.` yeni satır dışındaki herhangi bir karakterle eşleşen özel bir karakter sınıfıdır. |
| 106 | + |
| 107 | +Örneğin: |
| 108 | + |
| 109 | +```js run |
| 110 | +alert( "Z".match(/./) ); // Z |
| 111 | +``` |
| 112 | + |
| 113 | +Veya düzenli ifadenin ortasında: |
| 114 | + |
| 115 | +```js run |
| 116 | +let regexp = /CS.4/; |
| 117 | + |
| 118 | +alert( "CSS4".match(regexp) ); // CSS4 |
| 119 | +alert( "CS-4".match(regexp) ); // CS-4 |
| 120 | +alert( "CS 4".match(regexp) ); // CS 4 (boşlukta bir karakter) |
| 121 | +``` |
| 122 | + |
| 123 | +Bir noktanın "herhangi bir karakter" anlamına geldiğini, ancak "karakterin olmaması" anlamına gelmediğini lütfen unutmayın. Eşleşecek bir karakter olmalı: |
| 124 | + |
| 125 | +```js run |
| 126 | +alert( "CS4".match(/CS.4/) ); // null, eşleşme yok çünkü nokta için karakter yok |
| 127 | +``` |
| 128 | + |
| 129 | +### "s" işareti, kelimenin tam anlamıyla herhangi bir karakter olarak nokta |
| 130 | + |
| 131 | +Normalde, bir nokta yeni satır `\n` karakteriyle eşleşmiyor. |
| 132 | + |
| 133 | +Örneğin, `pattern:A.B`, aralarında herhangi bir karakter olan `match:A` ve `match:B` ile eşleşir, yeni satır `\n` hariç: |
| 134 | + |
| 135 | +```js run |
| 136 | +alert( "A\nB".match(/A.B/) ); // null (eşleşme yok) |
| 137 | +``` |
| 138 | + |
| 139 | +Noktanın kelimenin tam anlamıyla "herhangi bir karakter" anlamına gelmesini istediğimiz birçok durum vardır, yeni satır dahil. |
| 140 | + |
| 141 | +`pattern:s` işte bunu yapar. Eğer düzenli ifadede varsa, nokta `pattern:.` tam anlamıyla herhangi bir karakter ile eşleşir: |
| 142 | + |
| 143 | +```js run |
| 144 | +alert( "A\nB".match(/A.B/s) ); // A\nB (eşleşti!) |
| 145 | +``` |
| 146 | + |
| 147 | +````warn header="Firefox, IE, Edge bunu desteklemiyor" |
| 148 | +En son destek durumu için <https://caniuse.com/#search=dotall> adresini ziyaret edin. Bu makale yazılırken, Firefox, IE, Edge desteklemiyordu. |
| 149 | +
|
| 150 | +Neyse ki, her yerde çalışan bir alternatif var. Herhangi bir karakteri eşleştirmek için `pattern:[\s\S]` gibi bir normal ifade kullanabiliriz. |
| 151 | +
|
| 152 | +```js run |
| 153 | +alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (eşleşti!) |
| 154 | +``` |
| 155 | +
|
| 156 | +`pattern:[\s\S]` tam anlamıyla şu anlama geliyor: "boşluk karakteri VEYA boşluk karakteri değil". Başka bir deyişle, "her şey". Bunun için başka bir karakter sınıfı da kullanabiliriz, `pattern:[\d\D]` gibi. |
| 157 | +
|
| 158 | +Bu numara her yerde çalışıyor. Ayrıca, bunu kalıpta normal "yeni satırla eşleşmeyen" nokta istediğimiz durumlarda `pattern: s` işaretini istemiyorsak kullanabiliriz. |
| 159 | +```` |
| 160 | + |
| 161 | +````warn header="Pay attention to spaces" |
| 162 | +Genellikle boşluklara çok az dikkat ederiz. Bizim için `subject:1-5` ve `subject:1 - 5` string'leri neredeyse aynıdır. |
| 163 | +
|
| 164 | +Ancak düzenli ifade boşlukları dikkate almazsa, işe yaramayabilir. |
| 165 | +
|
| 166 | +Kısa çizgi ile ayrılmış rakamları bulmaya çalışalım: |
| 167 | +
|
| 168 | +```js run |
| 169 | +alert( "1 - 5".match(/\d-\d/) ); // null, eşleşme yok |
| 170 | +``` |
| 171 | +
|
| 172 | +Bunu boşluk ekleyerek düzeltelim `pattern:\d - \d`: |
| 173 | +
|
| 174 | +```js run |
| 175 | +alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, şimdi çalışıyor |
| 176 | +// veya \s sınıfını kullanabiliriz: |
| 177 | +alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, bu da çalışıyor |
| 178 | +``` |
| 179 | +
|
| 180 | +**Boşluk bir karakterdir. Diğer herhangi bir karakterle aynı derecede önemlidir.** |
| 181 | +
|
| 182 | +Düzenli ifadeye boşluk ekleyip veya ifadeden boşluk kaldırdıktan sonra bu ifadenin aynı şekilde çalışmasını bekleyemeyiz. |
| 183 | +
|
| 184 | +Başka bir deyişle, normal bir ifadede tüm karakterler önemlidir, boşluklar da. |
| 185 | +```` |
| 186 | + |
| 187 | +## Özet |
| 188 | + |
| 189 | +Aşağıdaki karakter sınıfları vardır: |
| 190 | + |
| 191 | +- `pattern:\d` -- rakamlar. |
| 192 | +- `pattern:\D` -- rakam olmayanlar. |
| 193 | +- `pattern:\s` -- boşluk sembolleri, tablar, yeni satırlar. |
| 194 | +- `pattern:\S` -- `pattern:\s` olmayan. |
| 195 | +- `pattern:\w` -- Latin harfler, rakamlar, alt çizgi `'_'`. |
| 196 | +- `pattern:\W` -- `pattern:\w` olmayan. |
| 197 | +- `pattern:.` -- `'s'` varsa gerçekten herhangi bir karakter, yoksa yeni satır `\n` hariç herhangi bir karakter. |
| 198 | + |
| 199 | +...Ama hepsi bu değil! |
| 200 | + |
| 201 | +String'ler için JavaScript tarafından kullanılan Unicode kodlama, karakterler için birçok özellik sağlar, örneğin: bir karakterin hangi dile ait olduğu (eğer bir harf ise) veya karakterin bir noktalama işareti olup olmadığı vb. |
| 202 | + |
| 203 | +Bu özelliklere göre de arama yapabiliriz. Bu, bir sonraki makalede ele alınan `pattern:u` işaretini gerektirir. |
0 commit comments