Düzenli ifade
![]() | Bu madde, Vikipedi biçem el kitabına uygun değildir. (Ağustos 2009) |
Bilgisayarcılıkta düzenli ifadeler veya kurallı ifadeler, ele alınan metindeki kimi katarların kısa yoldan ve esnek bir biçimde belirlenmesini sağlar. Bu katarlar belli karakterler, kelimeler veya karakter örüntüleri olabilir. Düzenli ifadeler, bir biçimsel dil kullanarak yazılır ve bir düzenli ifade işleyici tarafından yorumlanır. Bir düzenli ifade işleyici, ya ayrıştırıcı üreteci olarak hizmet eden ya da metni inceleyip verilen tarife uygun kısımlarını belirleyen bir programdır.
Aşağıda bir düzenli ifade ile ifade edilebilecek tariflere birkaç örnek görülebilir:
- herhangi bir yerde bulunan "ara" karakter dizisi; "ara", "araba", "paravan" gibi
- diğer karakterlerden yalıtılmış şekilde bulunan "ara" kelimesi
- kendisinden önce "kısa" veya "uzun" kelimesi geçen "ara" kelimesi
- bir veya daha fazla rakamdan sonra gelen "TL" karakter dizisi
Düzenli ifadeler hemen hemen tüm programlama dillerinde kütüphaneler olarak mevcuttur. Ancak bunlar her biçimsel dili ayırmak için yeterli değildir, bkz. Biçimsel dil kuramı. Pek çok programlama dili ve/veya programlama dilinde, bu işlem ayrıştırıcı jeneratör yardımı ile otomatik üretilen bir programla yapılabilir.
Kullanım alanları
Düzenli ifadeler pek çok farklı metin işleme işlerinde, ve daha genel olarak verinin sadece metin olmadığı katar işleme işlerinde kullanılmaktadır. Yaygın uygulamaları veri doğrulama, veri ayıklama (özellikle ağ ayıklama), veri dönüştürme, basit (metin) ayrıştırma, sözdizimi vurgulama sistemlerinin hazırlanması, ve daha pek çok diğer görevlerdir.
Internet arama motorlarında düzenli ifade kullanımı faydalı olabilecek olsa da, bütün veritabanı üzerinde çalıştırılması, düzenli ifadenin karmaşıklığına ve tasarımına bağlı olarak çok fazla işlemci gücü gerektirebilmektedir. Sistem yöneticileri veritabanlarında düzenli ifadeler tabanlı sorgular çalıştırabilseler de, çoğu arama motoru düzenli ifade desteğini kullanıcılarına sağlamaz. Bu konuda önemli istisnalar Google Code Search, Exalead gibi özelleşmiş arama motorlarıdır.
Düzenli ifadeler (İngilizce kısaltması regexp, regex), hesaplama alanında belirli yazım kurallarına göre düzenlenmiş, bir dizge (yazı karakteri) setini tanımlayan veya onunla uyuşan dizgelerdir. Düzenli ifadeler birçok metin düzenleyici, arama araçları ve metin tabanlı belirli desenleri idare etme araçları tarafından kullanılır. Birçok programlama dili dizgeleri idare etmek için düzenli ifadeleri destekler. Örneğin Perl ve Tcl direkt kendi yazım kurallarına gömülü, güçlü düzenli ifadelere sahiptir. Unix dağıtımları tarafından sağlanan araçlar seti(düzenleyici sed ve filtreleyici grep de dahil olmak üzere) düzenli ifadeler kavramının tanınırlığını ilk artıranlardandı.
Temel Kavramlar
Bir düzenli ifade, çoğunlukla desen olarak geçen, dizgeler seti tanımlayan bir ifadedir. Genellikle tüm elemanları listelemeden setin kısa bir tanımını vermek için kullanılırlar. Örneğin Handel, Händel, ve Haendel dizgelerini içeren bir set "H(ä|ae?)ndel" deseni ile tanımlanabilir(ya da desen 3 dizgenin her biri ile eşleşir(matches) de denebilir). Çoğu biçimci yaklaşımda eğer özel bir set ile uyuşan herhangi bir düzenli ifade varsa buna benzer sonsuz sayıda ifade vardır. Çoğu biçimci yaklaşım düzenli ifadeleri oluşturmak için takip eden işlemleri sağlar.
- Seçenekleme
- Dikey bir çizgi seçenekleri ayırır. Örneğin "gr(a|e)y" olarak kısaltılabilecek olan "gray|grey" "gray" ya da "grey" ile eşleşir.
- Gruplama
- Parantezler işleçlerin (operatör) alan ve önceliklerini tanımlamak için kullanılır. Örneğin "gray|grey" ve "gr(a|e)y" değişik desenlerdir, ama her ikisi de gray ve grey`i içeren kümeyi tanımlar.
- Niceleme
- Bir karakter ya da grubun ardından gelen niceleyici öncesindeki ifadenin kaç kez görülebileceğini belirtir. En temel niceleyiciler ?, * ve +`dır.:
- ?
- Soru işareti öncesindeki ifadenin 0 veya 1 kez geçtiğini gösterir. Örneğin "colou?r", colour ve color`un her ikisi ile de eşleşir.
- *
- Asteriks, öncesindeki ifadenin 0, 1 veya herhangi bir sayıda olabileceğini gösterir. Örneğin "go*gle, ggle, gogle, google, gooogle...vb ile eşleşir.
- +
- Artı işareti öncesindeki ifadenin en az bir kez geçtiğini gösterir. Örneğin "go+gle", gogle, google, gooogle, vb ile eşleşir (ama ggle ile eşleşmez).
Bu yapılar, tıpkı sayılar ve +, -, *, / gibi işleçler ile cebirsel ifadeler oluşturulabileceği gibi rastgele karmaşık ifadeler yaratmak için birleştirilebilir.
Lua hatası 23 satırında Modül:Dil: Girilen dil kodu veritabanında bulunamadı. Lütfen Modül:Dil/veri'yi kontrol edin..
Karakter | Sonuç/Kullanım |
---|---|
Herhangi bir karakter | Herhangi bir karakter belirlenmeksizin bir karakteri temsil eder. |
. | Sayfa sonu veya paragraf sonu haricindeki herhangi bir karakteri temsil eder. Örneğin, "tak.im" arama terimi "takvim" ve "taksim" sonuçlarının ikisiyle de döner. |
^ | Eğer terim sadece paragraf başında ise aranılan terimi bulur. Boş alanlar veya karaktere tutturulmuş çerçeveler gibi paragraf başındaki özel nesneler dikkate alınmaz. Örnek: "^Selma". |
$ | Eğer terim sadece paragraf sonunda ise aranılan terimi bulur. boş alanlar veya karaktere tutturulmuş çerçeveler gibi paragraf başındaki özel nesneler dikkate alınmaz. Örnek: "Selma$".
$ kendi başına bir paragrafın sonu ile eşleşir. Bu şekilde paragraf sonlarını bulup değişltirmek mümkün hale gelir.. |
* | "*" karakterinin önündeki 0 veya daha fazla karakteri bulur. Örneğin, "Ab*c" finds "Ac", "Abc", "Abbc", "Abbbc", ve buna benzer. |
+ | "+" karakterinin önündeki 1 veya daha fazla karakteri bulur. Örneğin , "AX.+4" arama terimi, "AXx4" veya "AXxyz4"metnini bulur, "AX4" metni bulunmaz.
Paragraftaki arama dizisine uygun en uzun metin daima bulunur. Eğer paragraf "AX 4 AX4" metnini içeriyorsa, bu pasaj vurgulanır. "AX 4" kısımı değil. |
? | "?" karakterinin önündeki 0 veya daha fazla karakteri bulur. Örneğin, "Metal?" arama terimi, "Metal" ve "Meta" sonuçlarını bulur. "x(ab|c)?y" ifadesi "xy", "xaby", or "xcy" metinlerini bulur. |
\ | Arama, "\" sonrasında girilen özel karakteri bir düzenli ifade olarak değil de bir normal karakter olarak işler (\n, \t, \> ve \< katışımları dışında). Örneğin, "ağaç\.", "ağaç." ifadesini bulurken "ağaçlar" ya da "ağaçla" ifadelerini bulmaz. |
\n | Shift+Enter tuş kombinasyonu ile eklenmiş satır kesmesini temsil eder. Satır kesmesini, paragraf kesmesi olarak değiştirmek için Aranan ve Yeni değer kutucuklarına \n'i girin ve ardından bir arama ve değiştirme gerçekleştirin.
İçin ara metin kutusu içindeki \n, Shift+Enter tuşları ile eklenmiş satır sonuna karşılık gelir. İle yerdeğiştir metin kutusundaki \n, Enter veya Return tuşları ile girilebilen paragraf sonlarına karşılık gelir. |
\t | Bir tab (sekme) karakterini gösterir. Bu ifadeyi ayrıca Yeni değer kutusunda da kullanabilirsiniz. |
\b | Bir kelime sınırını eşleştir. Örneğin, "\bbook" ifadesi "bookmark" ifadesini bulur ancak "checkbook" ifadesini bulmaz. Oysa "book\" ifadesi "checkbook" ifadesini bulur ancak "bookmark" ifadesini bulmaz. Aranan kelime "book" her iki aramada da bulunur. |
^$ | Boş paragrafları arar. |
^. | Bir paragraf başındaki ilk karakteri bulur. |
& veya $0 | Aranankutusundaki arama ölçütüne göre bulunan metine, Değişiklik yaptığınız zaman, Yeni değer metin kutusunda belirlediğiniz metni ekler.
Örneğin, eğer Aranan kutusunda "pencere" metnini girer ve Yeni değer kutusuna "& çerçevesi" metnini girerseniz, "pencere" metni "pencere çerçevesi" metni ile değiştirilecektir. Ayrıca, arama ölçütleriyle bulduğunuz metinlerin, Öznitelikleri'ni değiştirmek ya da bunları farklı bir Biçim ile kullanmak için de Yeni değer kutusuna bir "&" işareti girebilirsiniz. |
[abc123] | Köşeli ayraçlar arasındaki içindeki karakterleri bulur. Örneğin, s[eü]t ile, "set" ve "süt" sözcüklerini bulabilirsiniz. |
[a-e] | Başlangıç ve bitiş karakterlerini de içerecek şekilde, a ve e arasındaki karakterleri simgeler
Karakterler kod numaralarına göre sıralanır. |
[a-eh-x] | a-e ve h-x arasındaki karakterleri bulur. |
[^a-s] | a ile s karakter aralığı dışındaki tüm karakterleri bulur. Örneğin "a[^a-k]ın" "alın" ve "atın" sözcüğünü bulabilir, ancak "akın" sözcüğünü bulamaz. |
\uXXXX
\UXXXXXXXX |
Dört basamaklı onaltılık Unicode koda (XXXX) dayalı bir karakteri temsil eder.
Belirsiz karakterler için büyük U ve sekiz tane on altılık basamaklı (XXXXXXXX) ayrı bir çeşidi vardır. Özel karakterler için belirli sembol yazı tipleri için kodlar kullanılan yazı tipine bağlı olabilir. Kodları, Ekle - Özel Karakter menü komutunu seçerek görüntüleyebilirsiniz. |
| | "|" öncesindeki ve "|" sonrasındaki terimleri bulur. Örneğin, "bu|şu", "bu" ve "şu" terimlerini bulur. |
{2} | Başlangıç ayracının önündeki karakterin kaç kez tekrarlanacağını tanımlar. Örneğin, "sa{2}t" "saat" sözcüğünü bulur, ancak "sat" sözcüğünü bulmaz. |
{1,2} | Başlangıç ayracının önündeki karakterin veya ifadenin en az n kez yinelendiği yerlerde. Örneğin, "10{3,}" "1000", "1000000" metinlerini bulur, ancak "100" bulunmaz. |
{1,} | Başlangıç ayracının önündeki karakterin veya ifadenin en az n kez yinelendiği yerlerde. Örneğin, "10{3,}" "1000", "1000000" metinlerini bulur, ancak "100" bulunmaz. |
( ) | Aranan kutusunda:
Ayraç içindeki karakterleri başvuru olarak tanımlar. Geçerli ifadede ilk başvuruya "\1" ile, ikinci başvuruya "\2" gibi biçimlerde başvuruda bulunabilirsiniz. Örneğin, metniniz 13487889 sayısını içeriyorsa ve aramanız (8)7\1\1 düzenli ifadesini kullanıyorsa, "8788" sonucu bulunur. Parantezleri () terimleri gruplamak için kullanabilirsiniz; örneğin "a(bc)?d" ifadesi "ad" veya "abcd" ifadelerini bulacaktır. Yeni değer kutusunda: Başvuruları değiştirmek için \ (ters bölü) yerine $ (dolar) kullanın. Bulunan karakter dizisinin tümünü değiştirmek için $0 kullanın. |
[:alpha:] | Alfabetik karakterleri bulur. [:alpha:]+ alfabetik karakterlerden oluşan metin dizilerini bulur. |
[:digit:] | Tek basamaklı bir sayı bulur. Birden fazla basamaklı bir sayı bulmak için [:digit:]+ parametresini kullanın. |
[:alnum:] | Alfanimerik karakterleri ([:alpha:] ve [:digit:]) temsil eder. |
[:space:] | Boşluk karakterini bulur (sekme karakterleri, veya bölünemez boşluk karakterleri bulunmaz). |
[:print:] | Yazdırılabilir karakterleri bulur. |
[:cntrl:] | Yazdırılamayan karakterleri bulur. |
[:lower:] | Seçenekler alanında BÜYÜK/küçük harf duyarlı seçeneği işaretlendiyse, küçük harf karakterleri bulur. |
[:upper:] | Seçenekler alanında büyük/küçük harf duyarlılığı seçeneği işaretlendiyse, büyük harf karakterleri bulur. |
Örnekler
e([:digit:])? -- sıfır veya bir sayıdan sonra gelen 'e' karakterini bulur. [:digit:] gibi tüm isimlendirilmiş karakter sınıflarının parantezler içine alınması gerektiğini unutmayın.
^([:digit:])$ --Sadece tek basamaklı satırları ya da hücreleri bulur.
Arama terimlerini karmaşık arama işlemlerini gerçekleştirecek şekilde birleştirebilirsiniz.
Bir paragraf içindeki yalnız üç haneli sayıları bulmak için
^[:digit:]{3}$
^ aramanın paragraf başından başlıyacağı anlamına gelir,
[:digit:] herhangi ondalık hane anlamına gelir,
{3} "rakam" hanelerinin tam olarak üç adet olacağını belirler,
$ eşleştirmenin paragraf sonunda bitmesi gerektiğini belirler.
Kaynakça
Dış bağlantılar
- Linux Focus`taki düzenli ifadeler çevirisi30 Haziran 2008 tarihinde Wayback Machine sitesinde arşivlendi.