Regex - Bayraklar (Flags/Options)

2022-01-20

Regex - Giriş makalemizde düzenli ifadelere hızlı bir giriş yapmıştık. Bu makalemizde konuyu bir adım daha ileri götürüp bayraklardan(flags) bahsedeceğim. Başlamadan önce söylemeliyim ki bir ortama girip Regex bayrakları dediğinizde bunu muhtemelen kimse anlamayacaktır. Bu nedenle ben de Türkçe’ye çevirmeyip direkt flags ya da options ifadelerini kullanacağım.

Regex Flags ya da Regex Options, bir düzenli ifadeyi yazarken, yazdığımız ifadenin çalışma biçimini belirler. Bu cümle ile kafalar iyice karıştı. Bu nedenle direkt örnekler üzerinden adım adım gitmeyi daha uygun buluyorum.

Nasıl Kullanılır?

Yazdığımız bir regex’e flag tanımlamak için regex’in sınırlarını oluşturan son / karakterinden sonra kullanmak istediğimiz flag’leri yerleştiririz.

/[a-z]/g

Yukarıdaki örnekte g bir flag olarak eklenmiştir ve Global anlamını taşır. Tanımlayabileceğimiz options değerlerini bir tabloda görelim.

Flag AdıFlagAçıklama
globalgTanımlanan regex ile tüm eşleşmeleri yakala.
insensitiveiBüyük/küçük harf duyarsız hale getirir.
multilinemBirden fazla satırda regex taraması yapılmasını sağlar.
unicodeuUnicode tanımlarının regex içinde kullanımına izin verir.

Regex Flags

Yukarıdakilerin dışında indices(d), sticky(y), single-line(s) gibi flag’ler olsa da şimdiye kadar hiç kullanmadığım için onlardan bahsetmeyeceğim.

Global Flag (g)

Bir regex tanımladığımızda, eğer bir flag belirtmezsek tanımladığımız regex varsayılan olarak sadece bir eşleşme yapar. Regex’e Global flag eklediğimizdeyse tüm eşleşmeleri yakalamasını söylemiş oluruz. Örneğin sayıları yakalayan bir regex yazalım ve test edelim.

/[0-9]+/

_config.yml

Tanımladığımız regex ilk eşleşmeyi yakaladı ancak diğerlerine bakmadı. Bir de Global flag tanımlayarak bakalım.

/[0-9]+/g

_config.yml

Bu kez tüm sayıları yakalayabildik.

Insensitive Flag (i)

Tanımladığımız düzenli ifadeler, büyük-küçük harf duyarlıdır. Bu durumu tersine çevirmek için i flag’ini kullanırız.

/fsm/g

_config.yml

Küçük harflerle tanımlanmış fsm ifadesi, metindeki FSM ifadesiyle eşleşmedi. Eşleşmesi için i flag’ini ekleyelim.

/fsm/gi

_config.yml

Burada dikkat etmemiz gereken bir konu da insensitive flag’i Türkçe karakterleri kapsamadığıdır. Bu nedenle Türkçe karakterleri regex’te tanımlamak gerekir.

/istanbul/gi

_config.yml

İstanbul ifadesinin yakalanması için aşağıdaki gibi bir tanım yapmalıyız.

/[]stanbul/gi

_config.yml

Multiline Flag (m)

Multiline Flag, tüm satır sonlarının metnin sonu olarak görülmesini sağlar. Regex’te kullandığımız $ karakterinin sadece metnin sonuyla değil tüm satırların sonuyla eşleşmeyi sağlar.

/köprüsü/gi

_config.yml

$ karakteri görevini yaptı ve sadece metnin sonundaki “köprüsü” ifadesiyle eşleşti. Ancak bizim istediğimiz tüm satırların sonundaki ifadelerle de eşleşmesi olursa multiline flag’ini kullanırız.

/köprüsü/gim

_config.yml

Unicode Flag (u)

Unicode Flag, regex içinde unicode kullanmamızı sağlar. Unicode kullanarak; para birimleri, Çince harfler, Arapça sayılar, emojiler gibi karakterleri daha kolay yakalayabiliriz. Regex’te unicode karakterler kategorilere ayrılır. Bu kategorileri property kullanarak yakalayabiliriz. Property tanımlama işlemi için \p{…} yapısı kullanılır. Örneğin süslü parantezler arasında kullanacağımız L karakteri, herhangi bir dildeki bir harfi belirtir.

/\p{L}/giu

_config.yml

L karakteri Letter property‘sinin kısaltmasıdır. Yukarıdaki ifadeyi \p{Letter} olarak da tanımlayabilirdik. Neredeyse tüm property‘ler bir kısaltmaya sahiptir.

_config.yml

Ana karakter kategorileri ve onların alt kategorileri:

  • Letter L:
    • lowercase Ll
    • modifier Lm,
    • titlecase Lt,
    • uppercase Lu,
    • other Lo.
  • Number N:
    • decimal digit Nd,
    • letter number Nl,
    • other No.
  • Punctuation P:
    • connector Pc,
    • dash Pd,
    • initial quote Pi,
    • final quote Pf,
    • open Ps,
    • close Pe,
    • other Po.
  • Mark M (accents etc):
    • spacing combining Mc,
    • enclosing Me,
    • non-spacing Mn.
  • Symbol S:
    • currency Sc,
    • modifier Sk,
    • math Sm,
    • other So.
  • Separator Z:
    • line Zl,
    • paragraph Zp,
    • space Zs.
  • Other C:
    • control Cc,
    • format Cf,
    • not assigned Cn,
    • private use Co,
    • surrogate Cs.

Bir de alt kategorilerden currency örneği yapalım.

\p{Currency_Symbol}\d

_config.yml

Bu ifadeyi kısaltma kullanarak daha kolay tanımlayabiliriz.

\p{Sc}\d

_config.yml

Regex’te önemli bir yere sahip olan flag‘lerin sonuna geldik. Hangi programlama dilini kullanıyorsanız kullanın mutlaka Regex’e ihtiyaç duyacaksınız. Bu nedenle Regex öğrenmeye başlamak yazılım hayatınızda vereceğiniz en güzel kararlardan biri ve bu güzel kararın arkasından önemli bir konuyu bitirdiniz bile. Tebrikler :)

Kaynaklar