Regex - Bayraklar (Flags/Options)
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ı | Flag | Açıklama |
global | g | Tanımlanan regex ile tüm eşleşmeleri yakala. |
insensitive | i | Büyük/küçük harf duyarsız hale getirir. |
multiline | m | Birden fazla satırda regex taraması yapılmasını sağlar. |
unicode | u | Unicode 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]+/
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
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
Küçük harflerle tanımlanmış fsm ifadesi, metindeki FSM ifadesiyle eşleşmedi. Eşleşmesi için i flag’ini ekleyelim.
/fsm/gi
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
İstanbul ifadesinin yakalanması için aşağıdaki gibi bir tanım yapmalıyız.
/[iİ]stanbul/gi
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
$ 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
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
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.
Ana karakter kategorileri ve onların alt kategorileri:
- Letter
L
:- lowercase
Ll
- modifier
Lm
, - titlecase
Lt
, - uppercase
Lu
, - other
Lo
.
- lowercase
- Number
N
:- decimal digit
Nd
, - letter number
Nl
, - other
No
.
- decimal digit
- Punctuation
P
:- connector
Pc
, - dash
Pd
, - initial quote
Pi
, - final quote
Pf
, - open
Ps
, - close
Pe
, - other
Po
.
- connector
- Mark
M
(accents etc):- spacing combining
Mc
, - enclosing
Me
, - non-spacing
Mn
.
- spacing combining
- Symbol
S
:- currency
Sc
, - modifier
Sk
, - math
Sm
, - other
So
.
- currency
- Separator
Z
:- line
Zl
, - paragraph
Zp
, - space
Zs
.
- line
- Other
C
:- control
Cc
, - format
Cf
, - not assigned
Cn
, - private use
Co
, - surrogate
Cs
.
- control
Bir de alt kategorilerden currency örneği yapalım.
\p{Currency_Symbol}\d
Bu ifadeyi kısaltma kullanarak daha kolay tanımlayabiliriz.
\p{Sc}\d
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 :)