&Anders.Lund; &Anders.Lund.mail;
İşbaran
Akçayır

    isbaran@gmail.com

-
Emir
SARI

    emir_sari@icloud.com

-

# Düzenli İfadeler

    Bu Ek, düzenli ifadeler dünyasına kısa;
    ancak umarım yeterli ve kapsamlı bir giriş içerir. Bu belgede,
    &kappname; içinde kullanılabilir olan düzenli ifadeler anlatılır.
    Bu düzenli ifade biçimi, ne perl düzenli ifadeleriyle ne de
    grep ile kullanılabilir düzenli ifadelerle
    doğrudan uyumlu değildir.

## Giriş

Düzenli İfadeler, bize bir metin dizisinin kimi olası içeriğini küçük bir yazılım parçası tarafından anlaşılacak şekilde tanımlamanın bir yolunu sağlar, böylece bir metnin eşleşip eşleşmediğini görebilir ve bazı gelişmiş durumlarda belirli parçaları veya eşleşen metni kaydedebiliriz.

Örnek: Bir metni, içinde Henrik veya Pernille adlarından biriyle başlayan ve sonrasında say gelen paragraflar için aramak istiyoruz.

Normal bir aramada, öncelikle adla aramaya başlardık; Henrik, belki sonrasında sa getirirdik: `Henrik sa`; eşleşmeleri ararken paragraf başı olmayan varyantları ve sa ile başlayan sözcükleri yok saymamız gerekirdi; örneğin says, said vb. Sonrasında bunların hepsini diğer adla da yinelememiz gerekecekti...

Düzenli İfadeler sayesinde bu görev tek bir aramayla ve daha büyük bir doğrulukla gerçekleştirilebilir.

Bunu başarmak için, Düzenli İfadeler, eşleşecek bir dizinin genelleştirilmesini ayrıntılı olarak ifade etmeye yönelik kuralları tanımlar. Sözcüğü tam anlamıyla şu şekilde ifade edebiliriz: Ya Henrik ya da Pernille ile başlayan bir satır (büyük olasılıkla öncesinde bir sekme karakteri veya 4 adet boşluk olabilir), sonrasında bir boşluk ve sa ve sonrasında ya ys veya id şu düzenli ifadeyle gösterilebilirdi:

`^[ \t]{0,4}(Henrik|Pernille) sa(ys|id)`

Yukarıdaki örnek, çağdaş Düzenli İfadelerin dört ana konseptinin tümünü göstermektedir:

- Dizgiler

- Savlar

- Niceleyiciler

- Geriye başvurular

İfadeyi başlatan şapka (`^`) bir savdır ve yalnızca aşağıdaki eşleşen dizi bir satırın başındaysa doğrudur.

`[ \t]` ve `(Henrik|Pernille) sa(ys|id)` dizgilerdir. İlki, ya bir boş ya da (yatay) sekme karakteriyle eşleşen bir karakter sınıfıdır; diğer dizgi ise ya `Henrik` ya da `Pernille` ile eşleşen bir alt dizgi ve `sa` dizisiyle tam olarak eşleşen bir parçadır ve son olarak ya `ys` ya da `id` ile eşleşen bir alt dizgidir

`{0,4}` dizisi, öncekinin 0’dan 4’e kadar herhangi bir yer olan bir niceleyicidir.

Geriye başvurular kavramını destekleyen düzenli ifade yazılımı, dizinin eşleşen kısmının tümünü ve parantez içine alınmış alt dizgileri kaydettiği için bu başvurulara bazı erişim araçları verildiğinde, ya eşleşmenin tümünü (düzenli bir ifadeyle bir düzenleyicide bir metin belgesi aranırken, bu genellikle seçilmiş olarak işaretlenir) ya da bulunan ad ya da yüklemin son kısmını ele alabiliriz.

Tümü birlikte, ifade nerede eşleşmesini istiyorsak yalnızca orada eşleşir.

Aşağıdaki bölümlerde dizgilerin, karakter sınıflarının, savların, niceleyicilerin ve geriye başvuruların nasıl oluşturulacağı ve kullanılacağı ayrıntılı olarak açıklanacak ve son bölümde birkaç yararlı örnek verilecektir.

## Dizgiler

Dizgiler, değişmez dizilerden ve karakter sınıflarından oluşur. Dizgiler, parantez içine alınmış dizgiler olan alt dizgiler içerebilir.

### Karakterleri kaçırmak

Dizgilerde olduğu gibi karakter sınıflarında da bazı karakterlerin özel bir anlamı vardır. Bu karakterlerden herhangi birini tam anlamıyla eşleştirmek için düzenli ifade yazılımının bu tür karakterleri gerçek anlamlarında yorumlaması gerektiğini bilmesini sağlamak amacıyla bunların imlenmesi veya kaçırılması gerekir.

Bu, karakterin başına ters eğik çizgi (`\`) getirilerek yapılır.

Düzenli ifade yazılımı, bağlamda herhangi bir özel anlamı olmayan bir karakterden kaçmayı sessizce yok sayar; bu nedenle, örneğin bir j (`\j`) karakterinden kaçmak güvenlidir. Bir karakterin özel bir anlamı olup olmadığından kuşkunuz varsa onu güvenle kaçırabilirsiniz.

Kaçış, elbette ters eğik çizgi karakterinin kendisini de içerir, böyle bir dizinin tam anlamıyla eşleşmesi için `\\` yazarsınız.

### Karakter sınıfları ve kısaltmalar

Bir karakter sınıfı, tanımlanmış bir karakter kümesinden biriyle eşleşen bir ifadedir. Düzenli ifadelerde karakter sınıfları, sınıfın yasal karakterlerini `[]` köşeli parantez içine alarak veya aşağıda açıklanan kısaltılmış sınıflardan birini kullanarak tanımlanır.

Basit karakter sınıfları yalnızca bir veya daha çok düz karakter içerir; örneğin, `[abc]` (a, b veya c harflerinden biriyle eşleşir) veya `[0123456789]` (herhangi bir rakamla eşleşir).

Harfler ve rakamlar mantıksal bir sıraya sahip olduğundan, erimlerini belirterek bunları kısaltabilirsiniz: `[a-c]`, `[abc]`'ye ve `[0-9]` ise `[0123456789]`'a eşittir. Bu yapıları birleştirerek; örneğin `[a-fynot1-38]` gibi tümüyle geçerli bir yapı oluşturabilirsiniz (sonuncusu, elbette a,b,c,d, e,f,y,n,o,t, 1,2,3 veya 8 ögelerinden biriyle eşleşecektir).

BÜYÜK harfler, BÜYÜK harf olmayan karşılıklarından farklı karakterler olduğundan, a veya b ile eşleşen ve BÜYÜK/küçük harf duyarsız bir karakter sınıfı oluşturmak için her durumda, onu `[aAbB]` olarak yazmanız gerekir.

Elbette herhangi bir şeyin dışındaki her şeyle eşleşen bir negatif sınıf oluşturmak olanaklıdır. Bunu yapmak için sınıfın başına bir şapka (`^`) koyun:

`[^abc]`, a, b veya c dışındaki herhangi bir karakterler eşleşir.

Gerçek karakterlerin yanı sıra bazı kısaltmalar da tanımlanmış olup bu da işimizi biraz daha kolaylaştırmaktadır:

`\a`

  Bu, &ASCII; zil karakteriyle (BEL, 0x07) eşleşir.

`\f`

  Bu, &ASCII; form besleme karakteriyle (FF, 0x0C) eşleşir.

`\n`

  Bu, &ASCII; satır besleme karakteriyle (LF, 0x0A, Unix yenisatır) eşleşir.

`\r`

  Bu, &ASCII; satır başı karakteriyle (CR, 0x0D) eşleşir.

`\t`

  Bu, &ASCII; yatay sekme karakteriyle (HT, 0x09) eşleşir.

`\v`

  Bu, &ASCII; dikey sekme karakteriyle (VT, 0x0B) eşleşir.

`\xhhhh`

  Bu, onaltılık hhhh Unicode karakteriyle eşleşir (0x0000 ve 0xFFFF arasında). \0ooo (&ie;, \zero ooo), ooo sekizlik &ASCII;/Latin-1 karakteriyle eşleşir (0 ve 0377).

`.` (nokta)

  Bu, herhangi bir karakterle eşleşir (yenisatır içerilir).

`\d`

  Bu, bir rakamla eşleşir. `[0-9]` ile aynıdır

`\D`

  Bu, rakam olmayan bir şeyle eşleşir. `[^0-9]` veya `[^\d]` ile aynıdır

`\s`

  Bu, boşluk karakteriyle eşleşir. `[ \t\n\r]` ile aynı şeydir

`\S`

  Bu, boşluk olmayan bir karakterle eşleşir. `[^ \t\r\n]` ve `[^\s]` ile aynıdır

`\w`

  Herhangi bir sözcük karakteriyle eşleşir; bu durumda bu bir harf, rakam veya alt çizgi olabilir. `[a-zA-Z0-9_]` ile aynıdır

`\W`

  Bu, sözcük karakteri olmayan herhangi bir karakterler eşleşir; bu durumda bu harfler, sayılar ve alt çizgi dışındaki her şey olabilir. `[^a-zA-Z0-9_]` veya `[^\w]` ile aynıdır

Sınıfların POSIX biçimine simgelemi, `[:<class name>:]` de ayrıca desteklenir. Örneğin, `[:digit:]`, `\d`'e ve `[:space:]` de `\s`'e eşittir. POSIX karakter sınıflarının tam listesine buradan bakabilirsiniz.

Kısaltılmış sınıflar özel bir sınıfın içine yerleştirilebilir; örneğin bir sözcük karakteriyle, bir boşlukla veya bir noktayla eşleştirmek için `[\w \.]` yazabilirsiniz

#### Karakter sınıflarındaki özel anlamlara sahip karakterler

Aşağıdaki karakterlerin [] karakter sınıfı yapısında özel bir anlamı vardır ve bir sınıfa sözcüğün tam anlamıyla içerilebilmesi için kaçış karakterlerinin kullanılması gerekir:

`]`

  Karakter sınıfını sonlandırır. Sınıftaki ilk karakter olmadığı sürece kaçırılmalıdır (kaçırılmamış bir şapka işaretinden sonra gelebilir).

`^` (şapka)

  İlk karakter ise negatif sınıfı belirtir. Sınıfın ilk karakteri ise sözcüğün tam anlamıyla eşleşecek biçimde kaçırılmalıdır.

`-` (tire)

  Mantıksal bir erimi belirtir. Bir karakter sınıfı içinde her zaman kaçırılmalıdır.

`\` (ters eğik çizgi)

  Kaçış karakteri. Her zaman kaçırılmalıdır.

### Alternatifler: Bunlardan biriyle eşleştirmek

Bir dizi alternatif dizgiden birini eşleştirmek istiyorsanız bunları `|` (dikey çubuk karakteri) ile ayırabilirsiniz.

Örneğin John veya Harry bulmak istediğinizde `John|Harry` düzenli ifadesini kullanırsınız.

### Alt Dizgiler

Alt dizgiler, parantez içine alınmış dizgilerdir ve düzenli ifadeler dünyasında çeşitli kullanımları vardır.

#### Alternatifleri belirtmek

Bir dizi alternatifi daha büyük bir dizgi içinde gruplandırmak için bir alt dizgi kullanabilirsiniz. Alternatifler | (dikey çubuk) karakteriyle ayrılır.

Örneğin, int, float veya double sözcüklerinden biriyle eşleşmek için `int|float|double` dizgisini kullanabilirsiniz. Yalnızca bir boşluk ve ardından birkaç harf gelen bir tanesini bulmak istiyorsanız alternatifleri bir alt dizginin içine yerleştirin: `(int|float|double)\s+\w+`.

#### Eşleşen metni yakalamak (geriye başvurular)

Geriye başvuru kullanmak istiyorsanız dizginin istenilen kısmının anımsanması için `(DİZGİ)` alt dizgisini kullanın. Alt dizginin anımsanmasını önlemek için yakalamayan bir `(?:DİZGİ)` grubu kullanın.

Örneğin, aynı sözcüğün virgülle ve büyük olasılıkla bir miktar boşlukla ayrılmış iki örneğini bulmak istiyorsanız `(\w+),\s*\1` yazabilirsiniz. `\w+` alt dizgisi bir sözcük karakterleri parçası bulur ve ifadenin tümü onlardan sonra bir virgül, 0 veya birden çok boşluk ve aynı miktarda sözcük karakteri geliyorsa eşleşir. (`\1` dizisi, paranteze alınmış ilk alt dizgiye başvurur.)

`\1` kullanımı ile ilgili anlatım bozukluklarını önlemek için ardına birkaç rakam koyun (&eg; `\12`, 12. alt dizgi veya `2` içeren ilk alt dizgi olabilir); birden çok rakamlı alt dizgiler için biz `\{12}` kullanıyoruz.

Örnekler:

- `\{12}1`, 12 alt dizgisini kullan anlamına gelir

- `\123`, yakalama 1’i kullan, sonrasında 23’ü normal metin olarak kullan anlamına gelir

#### İleri Savlar

Bir ileri sav, ya `?=` ya da `?!` ile başlayan bir alt dizgidir.

Bill dizisi ile yalnızca ardından Gates gelmiyorsa eşleşmek istiyorsanız şu ifadeyi kullanabilirsiniz: `Bill(?! Gates)`. (Bu, hem Bill Clinton'u hem de Billy the kid'i bulur; ancak diğer eşleşmeleri sessizce yok sayar.)

Savlar için kullanılan alt dizgiler yakalanmaz.

Ayrıca Savlar bölümüne bakın.

#### Arkaya Savlar

Bir arkaya sav, ya `?<=` ya da `?<!` ile başlayan bir alt dizgidir.

Arka sav, ileri sav ile aynı etkiye sahiptir; ancak geriye doğru çalışır. Örneğin, fruit gerçek dizisiyle yalnızca önünde grape yoksa eşleşmek istiyorsanız `(?<!grape)fruit` ifadesini kullanabilirsiniz.

Savlar için kullanılan alt dizgiler yakalanmaz.

Ayrıca Savlar bölümüne bakın

### Dizgiler içinde özel anlam taşıyan karakterler

Aşağıdaki karakterlerin bir dizgi içinde anlamı vardır ve bunları tam anlamıyla eşleştirmek istiyorsanız kaçış karakterlerinin kullanılması gerekir:

`\` (ters eğik çizgi)

  Kaçış karakteri.

`^` (şapka)

  Dizinin başını bildirir.

`$`

  Dizinin sonunu bildirir.

`()` (sol ve sağ parantez)

  Alt dizgileri bildirir.

`{}` (sol ve sağ süslü ayraçlar)

  Sayısal niceleyicileri bildirir.

`[]` (sol ve sağ köşeli ayraçlar)

  Karakter sınıflarını bildirir.

`|` (dikey çubuk)

  Mantıksal OR. Alternatifleri ayırır.

`+` (artı işareti)

  Niceleyici, 1 veya daha çok.

`*` (yıldız işareti)

  Niceleyici, 0 veya daha çok.

`?` (soru işareti)

  İsteğe bağlı bir karakter. Bir niceleyici olarak yorumlanabilir, 0 veya 1.

## Niceleyiciler

Niceleyiciler, düzenli bir ifadenin bir karakterin, karakter sınıfının veya alt dizginin belirli bir sayısı veya sayı erimiyle eşleşmesine olanak tanır.

Niceleyiciler süslü ayraçlar içine alınır (`{` ve `}`) ve genellikle `{[en-az-oluş][,[en-çok-oluş]]}` biçimindedirler

Kullanımları en iyi örnekle açıklanabilir:

`{1}`

  Tam 1 oluş

`{0,1}`

  Sıfır veya 1 oluş

`{,1}`

  Aynısı, daha kısası ;)

`{5,10}`

  En az 5; ancak en çok 10 oluş.

`{5,}`

  En az 5 oluş, sınırsız.

Ek olarak, bazı kısaltmalar vardır:

`*` (yıldız işareti)

  `{0,}` gibi, herhangi bir sayıda oluş bul.

`+` (artı işareti)

  `{1,}` gibi, en az 1 oluş.

`?` (soru işareti)

  `{0,1}` gibi, sıfır veya 1 oluş.

### Açgözlülük

En çok değere sahip olmayan niceleyiciler kullanılırken, düzenli ifadeler aranan dizinin olabildiğince büyük bölümüyle eşleşmeye öntanımlıdır, buna genellikle açgözlü davranış denir.

Çağdaş düzenli ifade yazılımları, açgözlülüğü kapatmanın yollarını sağlar; ancak grafiksel bir ortamda bu özelliğe erişmenizi sağlamak arayüzün sorumluluğundadır. Örneğin, düzenli ifade araması sağlayan bir arama iletişim kutusunda En az eşleşme etiketli bir onay kutusu bulunabilir ve ayrıca açgözlülüğün öntanımlı davranış olup olmadığının belirtilmesi gerekir.

### Bağlamsal örnekler

Niceleyicilerin kullanımına ilişkin birkaç örnek:

`^\d{4,5}\s`

  1234 go ve 12345 now içindeki rakamlarla eşleşir; ancak 567 eleven veya 223459 somewhere içindekilerle eşleşmez.

`\s+`

  Bir veya daha çok boşluk karakteriyle eşleşir.

`(bla){1,}`

  blablabla dizisinin tümüyle ve blackbird veya tabla içindeki bla ile eşleşir.

`/?>`

  <closeditem/> içindeki /> ile ve <openitem> içindeki > ile eşleşir.

## Savlar

Savlar, düzenli bir ifadenin yalnızca belirli denetimli koşullar altında eşleşmesine olanak tanır.

Bir savın eşleşecek bir karaktere gereksinimi yoktur; olası bir eşleşmeyi onaylamadan önce çevreyi araştırır. Örneğin, sözcük sınırı savı, konumunda bir sözcüğün karşısında sözcük olmayan bir karakter bulmaya çalışmaz, bunun yerine bir sözcük karakterinin bulunmadığından emin olur. Bu, hiçbir karakterin olmadığı durumda iddianın eşleşebileceği anlamına gelir; örneğin aranan bir dizinin sonunda.

Bazı savların aslında eşleşecek bir dizgisi vardır; ancak dizi eşleşmesinin parçası, tam ifade eşleşmesinin sonucunun bir parçası olmayacaktır.

Burada belgelenen düzenli ifadeler aşağıdaki savları destekler:

`^` (şapka: dizinin başı)

  Aranan dizinin başlangıcıyla eşleşir.

  `^Peter` ifadesi, Peter, hey! dizisindeki Peter ile eşleşir; ancak Hey, Peter! ile eşleşmez

`$` (dizi sonu)

  Aranan dizinin sonuyla eşleşir.

  `you\?$` ifadesi, You didn’t do that, did you? dizisindeki son you ile eşleşir; ancak You didn’t do that, right? ile eşleşmez

`\b` (sözcük sınırı)

  Bir tarafta sözcük karakteri varken diğer tarafta yoksa eşleşir.

  Bu, sözcük sonlarını bulmak için kullanışlıdır; örneğin, bir sözcüğün tamamını bulmak için her iki uç da kullanılabilir. `\bin\b` ifadesi, He came in through the window dizisindeki in ile eşleşir; ancak window içindeki in ile eşleşmez.

`\B` (sözcük sınırı olmayan)

  \b ifadesinin eşleşmediği her yerde eşleşir.

  Bu, örneğin sözcüğün içinde eşleşeceği anlamına gelir: `\Bin\B` ifadesi, window ile eşleşir; ancak integer veya I’m in love ile eşleşmez.

`(?=DİZGİ)` (pozitif ileri bakış)

  İleriye bakan bir sav, dizinin olası bir eşleşmeyi takip eden kısmına bakar. Olası eşleşmeyi takip eden metin savın DİZGİ'siyle eşleşmezse pozitif bakış dizinin eşleşmesini engeller; ancak bununla eşleşen metin sonuçta içerilmez.

  `handy(?=\w)` ifadesi handyman içindeki handy ile eşleşir; ancak That came in handy! içindekiyle eşleşmez

`(?!DİZGİ)` (negatif ileri bakış)

  Negatif bakış, aranan dizinin aşağıdaki bölümünün DİZGİ ile eşleşmesi durumunda olası bir eşleşmenin onaylanmasını önler.

  `const \w+\b(?!\s*&)` ifadesi, const char* foo içindeki const char ile eşleşir; ancak const QString& bar içindeki const QString ile eşleşmez; çünkü & negatif ileriye bakan sav dizgisi ile eşleşir.

`(?<=DİZGİ)` (pozitif geri bakış)

  Arkaya bakma, ileriye bakmayla aynı etkiye sahiptir; ancak geriye doğru çalışır. Geriye doğru bir bakış, dizinin olası bir eşleşmeden önceki kısmına bakar. Pozitif geriye bakış, yalnızca savın DİZGİ'sinden önce geliyorsa bir diziyle eşleşir; ancak bununla eşleşen metin sonuçta içerilmez.

  `(?<=cup)cake` ifadesi,cake ile yalnızca önünde cup geliyorsa eşleşir (cupcake gibi; ancak cheesecake veya tek başına cake değilse).

`(?<!DİZGİ)` (negatif geri bakış)

  Negatif geriye bakış, aranan dizinin önceki kısmı DİZGİ ile eşleşmiyorsa olası bir eşleşmenin onaylanmasını önler.

  `(?<![\w\.])[0-9]+` ifadesi, =123 ve -123 dizilerindeki 123 ile eşleşir; ancak .123 veya word123 içindeki 123 ile eşleşemez.

`(DİZGİ)` (yakalayan grup)

  Parantez içindeki alt dizgi yakalanır ve anımsanır; böylece geriye başvurularda kullanılabilir. Örneğin, `(&quot;+)[^&quot;]*\1` ifadesi, `""""text""""` ve `"text"` ile eşleşir.

  Daha fazla bilgi için Eşleşen metni yakalamak (geriye başvurular) bölümüne bakın.

`(?:DİZGİ)` (yakalamayan grup)

  Parantez içindeki alt dizgi yakalanmaz ve anımsanmaz. Yakalamalar kullanılmayacaksa her zaman yakalamayan grupların kullanılması tercih edilir.