Skip to content

Commit b60edfc

Browse files
authored
Merge pull request #71 from gmertk/character-classes
Character classes
2 parents 2b824f6 + eb6cf51 commit b60edfc

File tree

99 files changed

+2466
-2446
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

99 files changed

+2466
-2446
lines changed
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
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+
![](love-html5-classes.svg)
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.
Lines changed: 1 addition & 0 deletions
Loading

0 commit comments

Comments
 (0)