Regular Expression oluşturmada kullanılan ifadeler aşağıdaki gibidir
table:/
İfade Açıklama
\ \ ile başlayanlar bir karakteri veya ön tanımlı bir ifadeyi belirtmek için kullanılır.
. Herhangi bir karakter
[] İçerisindeki birbirine birleşik yapılar için gruplandırmak için kullanılır. [^abc] : a veya b veya c
- İki karakter aralığındakiler anlamına gelir. [a-zA-Z] : a ile z ve A ile Z araı, [a-d[m-p]] : a ile d arası veya m ile p arası
^ değil anlamına gelen ifade. [^abc] : a, b veya c dışındaki diğer karakterler
&& kesisim için kullanılır. [a-z&&[def]] : d , e veya f. a-z ile [def] nin kesişimidir. [a-z&&[^bc]] : b ve c hariç, a ile z arası. [a-z&&[^m-p]] : m ile p arasındakiler hariç a ile z arası
\\ backslach (ters slach)
\0mnn sekizli (oktal) değerin karakter karşılığı)
\xhh veya \uhhhh (onaltılı (hezedecimal ) bir değerin karakter karşılığı )
\t tab
\n yeni satır
\r satır başı
\f form besleme karakteri
\a uyarı karakteri
\e escape karakteri
\cx x karakterine karşılık gelen kontrol karakteri
\d bir rakam 0 ile 9
\D rakam hariç karakter
\h yatay whitespace karakter
\H yatay whitespace karakter dışındaki karakter
\v düşey whitespace karakter
\V düşey whatespace karakter dışındakiler
\s whitespace karakter (yeni satır, tab, satır başı ..)
\S whatespace karakter dışında bir karakter
\w kelime ayıran karakter (word karakter) : [a-zA-Z_0-9]
\W kelime ayıran karakterlerden harici bir karakter
\b kelime
\B kelime değil
^ Satır
$ Satır sonu
\p{Lower} küçük harfli bir karakter: [a-z]
\p{Upper} büyük harfli bir karakter: [A-Z]
\p{ASCII} Bir ASCII karakteri: [\x00-\x7F]
\p{Alpha} alfabetik bir karakter :[\p{Lower}\p{Upper}]
\p{Digit} bir ondalık rakam : [0-9]
\p{Alnum} bir alfanumerik karakter :[\p{Alpha}\p{Digit}]
\p{Punct} noktalama işateti: !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph} görünebilir bir karakter : [\p{Alnum}\p{Punct}]
\p{Print} print edilebilir karakter : [\p{Graph}\x20]
\p{Blank} space veya tab: [ \t]
\p{Cntrl} kontrol karakterleri : [\x00-\x1F\x7F]
\p{XDigit} hexedacimal için kullanılan karakterlerden biri : [0-9a-fA-F]
\p{Space} Whitespace karakter: [ \t\n\x0B\f\r]
XY X sonra Y olmalı
X|Y X veya Y
(X) Gruplandırma
X? bir kere veya hiç (greedy yöntemi)
X* hiç veya birden daha fazla (greedy yöntemi)
X+ en az bir veya daha fazla (greedy yöntemi)
X{n} n kere tekrarlı olmalıdır (greedy yöntemi)
X{n,} en az n kere tekrarlı olmalıdır (greedy yöntemi)
X{n,m} en az en en fazla m kere tekrarlı olmalıdır (greedy yöntemi)
X?? bir kere veya hiç (reluctant yöntemi)
X*? hiç veya birden daha fazla (reluctant yöntemi)
X+? en az bir veya daha fazla (reluctant yöntemi)
X{n}? n kere tekrarlı olmalıdır (reluctant yöntemi)
X{n,}? en az n kere tekrarlı olmalıdır (reluctant yöntemi)
X{n,m}? en az en en fazla m kere tekrarlı olmalıdır (reluctant yöntemi)
X?+ bir kere veya hiç (reluctant yöntemi)
X*+ hiç veya birden daha fazla (possessive yöntemi)
X++ en az bir veya daha fazla (possessive yöntemi)
X{n}+ n kere tekrarlı olmalıdır (possessive yöntemi)
X{n,}+ en az n kere tekrarlı olmalıdır (possessive yöntemi)
X{n,m}+ en az en en fazla m kere tekrarlı olmalıdır (possessive yöntemi)
\Q \Q ve \E arasındaki karakterler escape eder ve normal karakter gibi işlev görür
\E \Q ve \E arasındaki karakterler escape eder ve normal karakter gibi işlev görür
table/:
Matcher sınıfı normal durumlarda arama işlemine en sondan başlar. Önce son karakteri alır ve karşılaştırmayı yapar. Eğer uyum olmaz ise bir önceki ile son karakteri birleştirir ve tekrar uyum arar. Uyum bulunana kadar devam edilir. Bu yöntem greedy yöntemidir. Diğer bir yöntem reluctant'dır ve solda ilk karakteri, sonra ilk iki karakteri vb.. uyum bulana kadar devam eder. Uyum bulunursa bulunduğu noktadan sonrasını aynı şekilde aramaya devam eder. Üçüncü yöntem ise possessive yöntemdir. Burada metni bütün olarak alınır ve uyulur ise bulur uymaz ise bulunmaz ve arama sonra erer.
Örneğin xfooxxxxxxfoo ifadesi için foo ile biten herhangi bir ifade arayalım. Bunun için .*foo şeklinde bir regular expression yazabiliriz. . (nokta) işareti herhangi bir karakter anlamındadır. * ise 0 veya istenildiği kadar anlamını verir.
Yukarıdaki arama greedy yöntemi ile yapılır. Önce tüm ifade alınır ve uyuluyor mu diye bakılır. Uyulmuyor ise sondan bir karakter atılır ve tekrar bakılır. Aşağıdaki gibi çalışacaktır :
Okunan | Kalan | Sonuç |
xfooxxxxxxfoo | | uymuyor |
xfooxxxxxxfo | o | uymuyor |
xfooxxxxxxf | oo | uymuyor |
xfooxxxxxx | foo | uyuyor |
İkinci yöntem reluctant ile yapılırsa
Okunan | Kalan | Sonuç |
x | fooxxxxxxfoo | Uymuyor |
xf | ooxxxxxxfoo | Uymuyor |
xfo | oxxxxxxfoo | Uymuyor |
xfoo | xxxxxxfoo | Uydu |
x | xxxxxfoo | Uymuyor |
xx | xxxxfoo | Uymuyor |
7xxx | xxxfoo | Uymuyor |
xxxx | xxfoo | Uymuyor |
xxxxx | xfoo | Uymuyor |
xxxxxx | foo | Uymuyor |
xxxxxxf | oo | Uymuyor |
xxxxxxfo | o | Uymuyor |
xxxxxxfoo | | Uydu |
Possessive ise bir bütün olarak alır ve karşılaştırır. xfooxxxxxxfoo ifadesi .foo pattern'ine uymamaktadır. (foo önünde harhangi bir karakterin olması gerekirken birden fazla karakter vardır). Aşağıda yukarıdaki sonucu test edebileceğiniz bir örnek görülmektedir :
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexQuantifierTest {
public static void main(String[] args) {
String text="xfooxxxxxxfoo";
Pattern pattern= Pattern.compile(".*foo");
//Pattern pattern= Pattern.compile(".*?foo");
//Pattern pattern= Pattern.compile(".*+foo");
Matcher m = pattern.matcher(text);
while(m.find()){
System.out.println(m.group());
}
}
}