ConFoo 2025

Karakter Sınıfları - Köşeli Ayraçlar

Bir karakter sınıfı [ köşeli ayracıyla ] köşeli ayracı arasına alınarak tanımlanır. Bir karakter sınıfı içinde ] köşeli ayracının özel bir anlamı yoktur, ancak bir karakter sınıfı içinde kullanılması gerekliyse sınıfın (varsa, şapka iminden sonraki) ilk üyesi olmak zorundadır, yoksa bir tersbölüyle öncelenmesi gerekir.

Bir karakter sınıfı eşleşmeye konu dizgenin içindeki tek bir karakterle eşleşir; sınıfın ilk üyesi bir şapka imi olmadıkça, eşleşen karakterin karakter sınıfının üyesi olması yeterlidir; aksi takdirde eşleşen karakterin sınıfın bir üyesi olmaması gerekir. Eğer şapka iminin bir karakter sınıfının üyesi olması gerekliyse, ya sınıfın ilk üyesi olmamalı ya da bir tersbölü ile öncelenmelidir.

Örneğin, [aeıioöuü] sınıfı herhangi bir küçük sesli ile eşleşirken [^aeıioöuü] sınıfı herhangi bir küçük sessizle eşleşecektir. Yalnız şuna dikkat edin: Karakter sınıfının başlangıcındaki şapka imi, sadece sınıfı olumsuzlayan bir gösterim uzlaşımıdır. Bir tez işleci değildir; eşleşmeye konu dizge içindeki karakterleri yine de tüketmeye devam eder ve dizgenin sonuna gelindiğinde başarısız olur.

Harf büyüklüğüne duyarsız eşleşme etkinken, sınıf içindeki herhangi bir harf, hem büyük hem de küçük harfi simgeleyecektir. Örneğin, harf büyüklüğüne duyarsız eşleşme etkinken [aeiou] sınıfı "A" veya "a" ile eşleşirken, [^aeiou] sınıfı harf büyüklüğüne duyarlılık etkin kılınmış gibi sadece "A" ile eşleşmeyecektir.

Satırsonu karakteri, PCRE_DOTALL veya PCRE_MULTILINE seçeneği atanmış olsun ya da olmasın karakter sınıfları içinde asla özel bir anlamda ele alınmaz. [^a] gibi bir sınıf daima bir satırsonu karakteri ile eşleşecektir.

Tire imi, bir karakter sınıfı içinde bir aralık belirtmek için kullanılabilir. Örneğin, [d-m] sınıfı, d ve m dahil ikisi arasında kalan herhangi bir karakterle eşleşecektir. Eğer bir tire iminin sınıfın bir üyesi olması gerekliyse, ya bir aralık belirteci olarak değerlendirilmeyeceği bir yere (başa veya sona) konmalı ya da tersbölü ile öncelenmelidir.

Bir "]" karakterinin kendisi olarak bir aralığın son karakteri olması mümkün değildir. Örneğin, [W-]46] şablonu içindeki sınıf "W" ve "-" karakterlerinden oluşacak, dolayısıyla sadece "W46]" veya "-46]" dizgesiyle eşleşecektir. Halbuki, "]" karakteri bir tersbölü ile öncelenseydi, [W-\]46] şablonu içindeki sınıf "W" ve "]" dahil arada kalan tüm karakterlerle eşleşecekti. Sınıf içinde "]" karakterini tersbölü ile öncelemek yerine karakterin sekizlik veya onaltılık gösterimleri de kullanılabilirdi.

Aralıklar ASCII harmanlama dizilimleri olarak çalışabildiği gibi örneğin, [\000-\037] şeklinde sayısal olarak belirtilmiş karakterler içinde kullanılabilir. Eğer harflerden oluşan bir aralık belirtilmişse ve harf büyüklüğüne duyarsız eşleşme yapılıyorsa aralık, içerdiği bir harfin hem büyüğüyle hem de küçüğüyle eşleşecektir. Örneğin [W-c] aralığı harf büyüklüğüne duyarsız olarak [][\^_`wxyzabc] dizgesiyle eşleşir. Eğer "tr" yereli kullanılıyorsa, [\xc6-\xcb] aralığı hem büyük hem de küçük Ç ile eşleşir.

\d, \D, \s, \S, \w ve \W karakter türleri de bir karakter sınıfı içinde kullanılabilir ve sınıfa eşleştikleri karakterleri eklerler. Örneğin, [\dABCDEF] sınıfı herhangi bir onaltılık rakam ile eşleşecektir. Şapka karakteri, küçük harfli işleçlerle sağlanandan daha sınırlı bir kümeyi belirtmek için büyük harfli işleçlerle kullanılabilir. Örneğin, [^\W_] sınıfı alt çizgi imi hariç herhangi bir harf veya rakam ile eşleşecektir.

Bir karakter sınıfının başlangıcında belirtildiğinde \, -, ^ karakterleri ve sonlandırıcı ] karakteri, karakter sınıfı içinde özel bir anlama sahip değildir, ancak öncelenmiş olmaları da bir sorun teşkil etmezdi. Şablon sonlandırıcı daima özeldir ve bir ifade içinde kullanıldığında daima öncelenmesi gerekir.

Perl, karakter sınıfları için POSIX gösterimini destekler. Bu gösterimde sınıf isimleri [: ve :] karakterleri arasına alınır. Örneğin, [01[:alpha:]%] şablonu, "0", "1", herhangi bir abecesel karakter veya "%" ile eşleşecekir. Desteklenen sınıf isimleri şunlardır:

Karakter sınıfları
alnumharfler ve rakamlar
alphasadece harfler
ascii0 - 127 arasındaki karakter kodları
blanksadece boşluk ve sekme karakteri
cntrldenetim karakterleri
digitonluk rakamlar (\d ile aynı)
graphboşluk hariç tüm basılabilen karakterler
lowerküçük harfler
printboşluk dahil tüm basılabilen karakterler
punctharfler ve rakamlar hariç tüm basılabilen karakterler
spacetüm boşluk karakterleri (\s ile benzer fakat aynı değil)
upperbüyük harfler
word"sözcük" karakterleri (\w ile aynı)
xdigitonaltılık rakamlar
space karakterleri: HT (9), LF (10), VT (11), FF (12), CR (13) ve boşluk (32). Farkedeceğiniz gibi VT karakteri de (kod 11) listeye dahil edilmiştir. Perl uyumluluğu açısından "space" ile \s arasındaki fark budur.

word ismi bir Perl eklemesi olup blank ismi Perl 5.8'deki bir GNU eklemesidir. Diğer bir ekleme de olumsuzlama belirten ^ karakteri olup ikinokta iminden hemen sonra kullanılır. Örneğin, [12[:^digit:]] şablonu "1", "2" veya rakam olmayan herhangi bir karakter ile eşleşir.

UTF-8 kipinde, 128'den büyük değerli karakterler POSIX karakter sınıflarının hiçbiriyle eşleşmeyecektir. libpcre 8.10'dan itibaren bazı karakter sınıfları Unicode karakter özelliklerini kullanacak şekilde değiştirilmiştir, bu durumda söz konusu kısıtlama geçerli değildir. Ayrıntılar için » PCRE(3) kılavuzuna bakın.

add a note

User Contributed Notes 3 notes

up
24
greaties at ghvernuft dot nl
3 years ago
From deep down the PCRE manual at http://www.pcre.org/pcre.txt :

\d any decimal digit
\D any character that is not a decimal digit
\h any horizontal white space character
\H any character that is not a horizontal white space character
\s any white space character
\S any character that is not a white space character
\v any vertical white space character
\V any character that is not a vertical white space character
\w any "word" character
\W any "non-word" character
up
7
Julian
1 year ago
Examples with Character classes

<?php

$stringA
= "1 In the beginning God created the heavens and the earth.";
$stringB = preg_replace('/[[:^alnum:]]/', '', $stringA); // string(46) "1InthebeginningGodcreatedtheheavensandtheearth"
$stringC = preg_replace('/[[:^alpha:]]/', '', $stringA); // string(45) "InthebeginningGodcreatedtheheavensandtheearth"
$stringD = preg_replace('/[[:^ascii:]]/', '', "Pokémon"); // string(6) "Pokmon"
$stringE = preg_replace('/[[:^blank:]]/', '*', $stringA); // string(57) "* ** *** ********* *** ******* *** ******* *** *** ******"
$stringF = preg_replace('/[[:blank:]]/', '-', $stringA); // string(57) "1-In-the-beginning-God-created-the-heavens-and-the-earth."

$stringG = sprintf("Vertical Tabulation: %s", chr(11)); // string(22) "Vertical Tabulation: "
$stringH = preg_replace('/[[:cntrl:]]/', '', $stringG); // string(21) "Vertical Tabulation: "
$stringLengthG = strlen($stringG); // int(22)
$stringLengthH = strlen($stringH); // int(21)

$stringI = preg_replace('/[[:digit:]]/', '', 'My age is 35'); //string(10) "My age is "
$stringJ = preg_replace('/[[:^digit:]]/', '', 'My age is 35'); // string(2) "35"

$stringK = preg_replace('/[[:^graph:]]/', '', $stringG); // string(19) "VerticalTabulation:"
$stringL = preg_replace('/[[:graph:]]/', '', $stringG); // string(3) " "

$stringM = preg_replace('/[[:lower:]]/', '', $stringG); // string(6) "V T: "
$stringN = preg_replace('/[[:^lower:]]/', '', $stringG); // string(16) "erticalabulation"

$stringO = preg_replace('/[[:^print:]]/', '', $stringG); // string(21) "Vertical Tabulation: "
$stringP = preg_replace('/[[:print:]]/', '', $stringG); // string(1) " "

$stringQ = preg_replace('/[[:punct:]]/', '', $stringG); // string(21) "Vertical Tabulation "
$stringR = preg_replace('/[[:^punct:]]/', '', $stringG); // string(1) ":"

$stringS = preg_replace('/[[:space:]]/', '', $stringG); // string(19) "VerticalTabulation:"
$stringT = preg_replace('/[[:^space:]]/', '', $stringG); // string(3) " "

$stringU = preg_replace('/[[:upper:]]/', '', $stringG); // string(20) "ertical abulation: "
$stringV = preg_replace('/[[:^upper:]]/', '', $stringG); // string(2) "VT"

$stringW = preg_replace('/[[:word:]]/', '', $stringG); // string(4) " : "
$stringX = preg_replace('/[[:^word:]]/', '', $stringG); // string(18) "VerticalTabulation"

$stringY = preg_replace('/[[:xdigit:]]/', '', 'abcdefghijklmnopqrstuvwxyz0123456789'); // string(20) "ghijklmnopqrstuvwxyz"
$stringZ = preg_replace('/[[:^xdigit:]]/', '', 'abcdefghijklmnopqrstuvwxyz0123456789'); // string(16) "abcdef0123456789"
up
7
wordragon at wrestingcontrol dot com
6 years ago
The documentation says:

"The character types \d, \D, \s, \S, \w, and \W may also appear in a character class, and add the characters that they match to the class."

It does not stress that other escape types may not. I wanted to split a string on either a comma (","), or a new line "\n". When my input stream began to include "\r\n", I decided to change "\n" to "\R". Unfortunately, my test string did not include a capital "R", or I might have found the problem sooner. My '/[\R,]/' was simply splitting on comma and the letter "R".

My test string...
"The Yum-Yum Company\r\n127 bernard street"

What DID work: '/(?:\R|,)+/'

["The Yum-Yum Company","127 bernard street"]

Given character classes only match one character, I can see clearly why my expectations were justifiably dashed, but hopefully this comment will save time for someone else.

I might add, this has taught me the value of PCRE_EXTRA (modifier "X"), which I have begun to use routinely now.
To Top