15 Aralık 2021

Karakter Sınıfları

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.

Bunu yapmak için sayı olmayan herhangi bir şeyi bulabilir ve kaldırabiliriz. Karakter sınıfları bu konuda yardımcı olabilir.

Karakter sınıfı, belirli bir kümedeki herhangi bir sembolle eşleşen özel bir gösterimdir.

Başlangıç için “rakam” sınıfını keşfedelim. \d olarak yazılır ve “herhangi bir tek basamağa” karşılık gelir.

Örneğin, telefon numarasındaki ilk haneyi bulalım:

let str = "+7(903)-123-45-67";

let regexp = /\d/;

alert( str.match(regexp) ); // 7

g işareti olmadan, düzenli ifade yalnızca ilk eşleşmeyi arar, yani ilk \d rakamını arar.

Tüm rakamları bulmak için g işaretini ekleyelim:

let str = "+7(903)-123-45-67";

let regexp = /\d/g;

alert( str.match(regexp) ); // eşleşenler dizisi: 7,9,0,3,1,2,3,4,5,6,7

// bunlardan sadece rakamlardan oluşan telefon numarası yapalım:
alert( str.match(regexp).join('') ); // 79035419441

Bu rakamlar için bir karakter sınıfıydı. Başka karakter sınıfları da var.

En çok kullanılanlar:

\d (“d” İngilizce “digit” kelimesinden geliyor)
Bir rakam: 0'dan 9'a bir karakter.
\s (“s” İngilizce “space” kelimesinden geliyor)
Bir boşluk sembolü: boşluklar, tablar \t, yeni satırlar \n ve \v, \f, \r gibi nadir karakterleri içerir.
\w (“w” İngilizce “word” kelimesinden geliyor)
Kelime karakteri: Latin alfabesinde bir harf ya da bir rakam ya da alt çizgi _. Latince olmayan harfleri kapsamaz (Kiril veya Hintçe gibi).

Örneğin, \d\s\w bir rakam, ardından bir boşluk sembolü ve onun ardından bir kelime karakteri anlamına gelir, 1 a gibi.

Düzenli ifadeler hem normal semboller hem de karakter sınıfları içerebilir.

Örneğin, CSS\d, ardından bir rakam gelen CSS ile eşleşir:

let str = "Is there CSS4?";
let regexp = /CSS\d/

alert( str.match(regexp) ); // CSS4

Ayrıca birçok karakter sınıfını aynı anda kullanabiliriz:

alert( "I love HTML5!".match(/\s\w\w\w\w\d/) ); // ' HTML5'

Eşleşme (her karakter sınıfı, ona karşılık gelen bir karaktere sahip):

Ters sınıflar

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.

“Ters”, diğer tüm karakterlerle eşleştiği anlamına gelir, örneğin:

\D
Rakam olmayan: \d hariç herhangi bir karakter, örneğin bir harf.
\S
Boşluk olmayan: \s hariç herhangi bir karakter, örneğin bir harf.
\W
Kelime karakteri olmayan: \w hariç herhangi bir karakter, yani Latin olmayan bir karakter veya boşluk sembolü.

Bu bölümün başlangıcında, +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.

let str = "+7(903)-123-45-67";

alert( str.match(/\d/g).join('') ); // 79031234567

Alternatif, daha kısa bir yol, rakam olmayan \D karakterleri bulmak ve bunları dizeden kaldırmaktır:

let str = "+7(903)-123-45-67";

alert( str.replace(/\D/g, "") ); // 79031234567

Nokta "herhangi bir karakter"tir

Nokta . yeni satır dışındaki herhangi bir karakterle eşleşen özel bir karakter sınıfıdır.

Örneğin:

alert( "Z".match(/./) ); // Z

Veya düzenli ifadenin ortasında:

let regexp = /CS.4/;

alert( "CSS4".match(regexp) ); // CSS4
alert( "CS-4".match(regexp) ); // CS-4
alert( "CS 4".match(regexp) ); // CS 4 (boşlukta bir karakter)

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ı:

alert( "CS4".match(/CS.4/) ); // null, eşleşme yok çünkü nokta için karakter yok

“s” işareti, kelimenin tam anlamıyla herhangi bir karakter olarak nokta

Normalde, bir nokta yeni satır \n karakteriyle eşleşmiyor.

Örneğin, A.B, aralarında herhangi bir karakter olan A ve B ile eşleşir, yeni satır \n hariç:

alert( "A\nB".match(/A.B/) ); // null (eşleşme yok)

Noktanın kelimenin tam anlamıyla “herhangi bir karakter” anlamına gelmesini istediğimiz birçok durum vardır, yeni satır dahil.

s işte bunu yapar. Eğer düzenli ifadede varsa, nokta . tam anlamıyla herhangi bir karakter ile eşleşir:

alert( "A\nB".match(/A.B/s) ); // A\nB (eşleşti!)
Firefox, IE, Edge bunu desteklemiyor

En son destek durumu için https://caniuse.com/#search=dotall adresini ziyaret edin. Bu makale yazılırken, Firefox, IE, Edge desteklemiyordu.

Neyse ki, her yerde çalışan bir alternatif var. Herhangi bir karakteri eşleştirmek için [\s\S] gibi bir normal ifade kullanabiliriz.

alert( "A\nB".match(/A[\s\S]B/) ); // A\nB (eşleşti!)

[\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, [\d\D] gibi.

Bu numara her yerde çalışıyor. Ayrıca, bunu kalıpta normal “yeni satırla eşleşmeyen” nokta istediğimiz durumlarda s işaretini istemiyorsak kullanabiliriz.

Pay attention to spaces

Genellikle boşluklara çok az dikkat ederiz. Bizim için 1-5 ve 1 - 5 string’leri neredeyse aynıdır.

Ancak düzenli ifade boşlukları dikkate almazsa, işe yaramayabilir.

Kısa çizgi ile ayrılmış rakamları bulmaya çalışalım:

alert( "1 - 5".match(/\d-\d/) ); // null, eşleşme yok

Bunu boşluk ekleyerek düzeltelim \d - \d:

alert( "1 - 5".match(/\d - \d/) ); // 1 - 5, şimdi çalışıyor
// veya \s sınıfını kullanabiliriz:
alert( "1 - 5".match(/\d\s-\s\d/) ); // 1 - 5, bu da çalışıyor

Boşluk bir karakterdir. Diğer herhangi bir karakterle aynı derecede önemlidir.

Düzenli ifadeye boşluk ekleyip veya ifadeden boşluk kaldırdıktan sonra bu ifadenin aynı şekilde çalışmasını bekleyemeyiz.

Başka bir deyişle, normal bir ifadede tüm karakterler önemlidir, boşluklar da.

Özet

Aşağıdaki karakter sınıfları vardır:

  • \d – rakamlar.
  • \D – rakam olmayanlar.
  • \s – boşluk sembolleri, tablar, yeni satırlar.
  • \S\s olmayan.
  • \w – Latin harfler, rakamlar, alt çizgi '_'.
  • \W\w olmayan.
  • .'s' varsa gerçekten herhangi bir karakter, yoksa yeni satır \n hariç herhangi bir karakter.

…Ama hepsi bu değil!

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.

Bu özelliklere göre de arama yapabiliriz. Bu, bir sonraki makalede ele alınan u işaretini gerektirir.

Eğitim haritası

Yorumlar

yorum yapmadan önce lütfen okuyun...
  • Eğer geliştirme ile alakalı bir öneriniz var ise yorum yerine github konusu gönderiniz.
  • Eğer makalede bir yeri anlamadıysanız lütfen belirtiniz.
  • Koda birkaç satır eklemek için <code> kullanınız, birkaç satır eklemek için ise <pre> kullanın. Eğer 10 satırdan fazla kod ekleyecekseniz plnkr kullanabilirsiniz)