Regular Expression (Kurallı İfadeler)

Nedir?

Regular expression, birçok programlama dilinde kullanılabilen ve sayısal ve dizgisel içeriklerde belirli kurllara uyan bölümleri bulan ifadelerdir. “Düzenli ifade” ile Türkçe karşılığını kullananlar olsa da bazı sözlüklerde karşılığı “kurallı ifadeler” olarak belirtilmektedir ve doğru olan da budur..

Nerelerde Kullanılır?

Tanımda da bahsettigimiz gibi birçok programlama dili (Perl,PHP,Java,Javascript,.Net …), işletim sistemi komutları, veri tabanı sorguları, arama/degistirme amaçlı uygulamalarda kullanılır.

Genelde ortak standart yazım kuralları olmasına karşı, kullanıldığı yerlere göre farklı ifadelerle de kurallı ifadeler oluşturulmaktadır. En yaygın kullanım Perl tipi kurallı ifade kullanımıdır.

PHP de Perl Uyumlu Regexp Fonksiyonları

Fonksiyon Açıklama
preg_grep Koşula uyan dizi elemanlarını seçer. Ör:
$fl_array = preg_grep("/^(\d+)?\.\d+$/", $array);
preg_match Regexp koşulunu metne uygular, sonuçlar diziye aktarılır. Ör:
preg_match($pattern, $subject, $matches, PREG_OFFSET_CAPTURE, 3);
preg_match_all İki boyutlu dizi kullanarak preg_match tan farklı olarak grup elemanlarını da ayırır. Ör:
preg_match_all("|<[^>]+>(.*)</[^>]+>|U",
"<b>example: </b><div align=left>this is a test</div>",
$out, PREG_PATTERN_ORDER);
preg_replace Bul değiştir işlemini regexp uygunluğuna göre yapar. Ör:
$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string);
preg_replace_callback preg_replace’den farklı olarak değiştirme işleminde PHP fonksiyonunu kullanır. Bu durum çok daha kapsamlı değişim yapabilme olanağı sağlar.
preg_split Regexp uyumuna göre metni bölme işlemi yapar. Ör:
$keywords = preg_split("/[\s,]+/", "hypertext language, programming");

PHP İçin Örnek Kodla

Örnek:

Yıl-ay-gün şeklinde verilen bir MySQL tarih formatını gün-ay-yıl formatına çevirme.

$tarih = "2005-03-08";

$tarih =  preg_replace("/(\d{4})[.\-\/](\d{1,2})[.\-\/](\d{1,2})/","\$3-\$2-\$1",$tarih);

echo $tarih;

Bu durumda ekrana 08-03-2005 yazacaktır.

08-03-2005

$ifade = "<p align="right"> Kırmızı kedi kendini yedi. </p>";
preg_replace("/(<[p|P])(\s+.[^>]*)/","\$3-\$2-\$1",$ifade);

<p> Kırmızı kedi kendini yedi. </p>

$ifade = "<p align="right"> </p>";
preg_replace("/<[p|P].*>\s*</[p|P]>/","",$ifade);

(içi boş paragraf “p” tagları silindi)

Linux (CAT) İçin Örnek Kodlar

Örnek text dosya (yeni.txt)

————–

Deneme amacıyla oluşturulan dosya..
ifadeler:
aaa
herhangi bir metin aaa
aaa herhangi bir metin
aaa herhangi bir metin aaa
herhangi bir metin aaa herhangi bir metin

————–

cat komutunun grep ile kullanımı ve regexp yazımları:

bash-2.05$ cat yeni.txt| grep ‘aaa’
aaa
herhangi bir metin aaa
aaa herhangi bir metin
aaa herhangi bir metin aaa
herhangi bir metin aaa herhangi bir metin
bash-2.05$ cat yeni.txt| grep ‘^aaa’
aaa
aaa herhangi bir metin
aaa herhangi bir metin aaa
bash-2.05$ cat yeni.txt| grep ‘aaa$’
aaa
herhangi bir metin aaa
aaa herhangi bir metin aaa
bash-2.05$ cat yeni.txt| grep ‘^aaa$’
aaa

Perle uygun “Regular Expression” Yazımı

Temel “Regular Expression” Yazımı
. herhangi bir karakter Nokta (.) herhangi bir karakteri(sayısal, dizgisel, özel, görünmez) ifade etmek için kullanılır. Örnekler:

“do.” yazımı; dog”“dot”“doe”, hecelerinden herhangi birisine uygundur.
“d..r” yazımı; “door” ve “deer” ifadelerine uygundur.

* önceki karakterin sıfır veya çok sayıda tekrar edebileceğini ifade eder Yıldız (*) simgesi kendisinden önce gelen karakterin (veya grubun) sıfır kez (hiç) veya çok sayıda tekrar edebileceğini gösterir. Örnekler:

“do.*” yazımı; “dog”“done”“doppleganger”, ifadelerini kapsamaktadır.

“to*” yazımı; “to” ve “too” ifadelerine uygundur.

“fre*..” yazımı;  “frat”“free”“from” ifadelerine uygundur.

+ önceki karakterin en az bir veya çok sayıda tekrar edebileceğini ifade eder Artı (+) simgesi * dan farklı olarak önceki karakter veya grubun en az bir defa bulunması koşulu getirir. Birden çok kez de tekrar edebilir. Örnekler:

“fre+..” yazımı;  “freak”“freeze”“fresh” ifadelerine uygundur.

? önceki karakterin sıfır veya bir kez bulunabileceğini ifade eder Soru işareti (?) kendisinden önceki karakter veya grubun olmayabileceğini veya bir kez tekrar edebileceğini gösterir. Örnekler:

“ton?e” yazımı; “toe” ve “tone” ifadelerine uygundur.

( )
gruplama Parantezler ( ) kalıpları (patterns) gruplamak için kullanılır. Burada amaç grup şeklinde işleme sokabilmektir. Örnekler:

(dog|cat) yazımı; “dog” ve “cat” ifadelerine uygundur.

[] gruptaki herhangi bir karakter Köşeli parantez ([]) içinde barındırdığı kalıba göre bir karakter yerine geçer. Örnekler:

“ta[pb]” yazımı;  “tap” ve “tab” ifadelerine uygundur.

“r[aeiou]t” yazımı; “rat”“ret”“rot”“rut” ifadelerine uygundur.

“r[aeiou]+t” yazımı; “rat” (plus all of the above)“riot”“root”, … ifadelerine uygundur.

[^] gruptaki herhangi bir karakter hariç (^) Simgesi eğer köşeli parantez ([]) içinde kullanılırsa, bu kendisinden sonraki karakter veya grubun bulunmayacağını ifade eder. Örnekler:

“t[^aeiou]+.*s” yazımı;  “thanks”“this”“trappings”, … ifadelerine uygundur.

{min,max} tekrar aralığı Küme parantezi ({}) ile bir önceki karakter veya grubun tekrar edilme miktarı tanımlanır. Eğer tek bir değer yazılırsa; yazılan değer kadar tekrar şarttır. Küme parantezi içine iki değer virgül ile ayrılarak yazılırsa; tekrar, soldaki küçük değerden az ve sağdaki büyük değerden fazla olamaz. Örnekler:

“[a-z]{3}” Bu örnekte küçük “a” harfi 3 defa tekrarlanmak zorundadır. Aksi taktirde koşula uymayacaktır.

“[0-9]{3,}” Bu örnekte ise ikinci değer tanımlanmadığından dolayı, en az 3 kez tekrarlanmalıdır. 3 ten çok tekrar kabul edilebilir.

“[A-Z]{2,5}” Bu örnek ise alt ve üst limitlerin tanımlanmasıyla, en az 2 en fazla 5 kez tekrar edebilir.

..

Karakter Etiketleri Yer Belirteçleri
\d Herhangi bir rakam [0-9] ^ Satırbaşı (eğer m düzenleyicisi varsa)
\D Rakam olmayan herhangi bir simge [^0-9] $ Satır sonu (eğer m düzenleyicisi varsa)
\w Herhangi bir harf, rakam veya alt çizgi (Türkçe harfler hariç) (alfanümerik) [a-zA-Z0-9_] \b Kelime başlangıç simgesi (^ ve $ gibi dedektör)
\W Alfanümerik olmayan [^a-zA-Z0-9_] \B Kelime başlangıcı olmayan durumlar
\s Herhangi bir boşluk karakteri [ \t\n\r\f]    
\S Boşluk karakteri olmayan [^ \t\n\r\f]    

..

Özel Karakterler
\n Satırbaşı karakteri
\r Windows için satırbaşı ilk simgesi
\t Tab simgesi
\e escape karakteri
\xFF Onaltılık değer ör: “FF”

..

Perl için “Regular Expression” Değiştiricileri (modifiers)
Değiştirici Açıklama
x Regexp yazımındaki boşlukları dikkate almaz
i Büyük küçük harf duyarlılığını iptal eder ( [a-z] = [A-Z] )
s Tüm satırları tek bir satır gibi işleme alır. Nokta karakteri satırbaşı simgelerini de kapsayabilir.
m Çoklu eşlemeye olanak sağlar. Her satırı ayrı değerlendirerek, ^ ve $ simgelerinin kullanımına olanak sağlar.
g Genel tarama olanağı sağlar. Regexp uyumlu bul-değiştir uygulamalarda ilk bulunan değil kurala uyan tüm değişikliklerin yapılmasını sağlar. Bu değiştirici etiket bazı uygulamalarda varsayılan olarak seçilidir.

Örnekler

  1. </?[^>]+>
    HTML etiketlerini ifade eder.
  2. (((+|-)?\d+(\.\d*)?)|((+|-)?(\d*\.)?\d+))
    Negatif veya pozitif tam ve ondalıklı sayı.
  3. (\d{4})[.-/](\d{1,2})[.-/](\d{1,2})
    yyyy.aa.gg biçimindeki tarih bilgisi. $1 = yıl, $2 = ay, $3 = gün
  4. (?#year)(19|20)\d\d[- /.](?#month)(0[1-9]|1[012])[- /.](?#day)(0[1-9]|[12][0-9]|3[01])
    Tarih formatının başka yazımı. Burada “(?#” ilebaşlayan bölüm açıklama yazmak üzere kullanılır ve açıklama metni “)” ile sonlanır.
  5. SELECT 'BT sorguda regexp BT' REGEXP '[[:<:]]BT.*BT[[:>:]]'
    MySQL e özgü yazımla regexp kullanımı.
  6. \d{2}\s?[A-Z]{1,3}\s?\d{2,4}
    Tr plaka tanımına uygun regexp gösterimi (özel plakalar hariç).