Anasayfa » Java ve Java Teknolojileri

Java – Regular Expressions (Düzenli İfadeler)

12 Kasım 2012 7.838 kez okundu 3 yorum
1 Star2 Stars3 Stars4 Stars5 Stars (3 oy,5 üzerinden : 4,00 )
Loading...

Merhaba arkadaşlar, bu yazımda java üzerinde regular expression (düzenli ifade) işlemlerinden bahsedeceğim.

Regular expression’lar genel anlamda string üzerinde belirli bir yapıyı arama modelidir. Yani genel bir string içerisinde sizin belirlediğiniz formata uyan yapıları bulmak amacıyla kullanılır. Bu yapılar, bir tarih formatı, bir telefon numarası formatı, bir email hesabı formatı gibi belli başlı formatlar olabileceği gibi, sizin belirleyeceğiniz orjinal bir format ta olabilir.

Örneğin   “xyzxyabcxyzttttxzhjxyz”  stringi içerisinde “xyz” kalıbını aramak istersek sonuç olarak bize şöyle bir yapı döner.

xyz—–xyz——–xyz

Öncelikle bu kalıbları oluştururken kullanılan yapılardan tablolar yardımıyla bahsedelim.

Regular Expression Açıklaması
. (nokta) noktaya karşılık herhangi bir işaret, karakter gelebilir
^ornek “ornek” kelimesi stringin başında ise eşleşir
ornek$ “ornek” kelimesi stringin sonunda ise eşleşir
[abc] bu yapının olduğu konumda a,b veya c varsa eşleşir. (Sadece bir tanesi eşleşir) Parantez sadece bir karakter demektir
[abc][vz] a,b veya c var ise ve hemen arkasından v veya z geliyor ise eşleşme olur. Toplamda iki karakter eşleşecek. av,az,bv,bz,cv,cz ihtimallerdir. Araya başka bir karakter alınmaz.
[^abc] Eğer bir kümenin başında ^ işareti var ise, parantez içinde saydığı karakter haricindeki karakterler eşleşir. Yani a, b veya c dışında bir karakter gelirse eşleşme sağlanır.
[a-d1-7] Bu yapı aralık belirtir. Yani a dan d ye kadar veya 1 den 7 ye kadar olan bir karakter gelirse eşleşir, toplamda ya harf ya rakam olacak. Yani bir karakter eşleşecek. Hem karakter hem sayı eşleşemez.
X|Z X veya Z den birisi eşleşecek.
XZ X var ise hemen arkasından da Z geliyor ise, yani XZ şeklinde bir string var ise eşleşecek
Regular Expression Açıklaması
\d 0 ile 9 arasında herhangi bir rakam
\D 0 ile 9 arasındaki rakamlar haricindeki karakter Kısaca : [^0-9]
\s Whitespace karakter, Kısaca: [ \t\n\x0b\r\f]
\S Whitespace karakter haricindeki bir karakter, Kısaca: [^\s]
\w Word karakter, Kısaca [a-zA-Z_0-9] Yani küçük harf, büyük harf veya rakam dan bir tanesi
\W Word karakter harici  bir karakter. Yani küçük harf, büyük harf veya rakam harici bir karakter [^\w]
\S+ Birden fazla white space karakter harici karakterler
Regular Expression Açıklama
* Sonuna geldiği yapının ya hiç olmaması, yada istediği kadar tekrar edebileceği anlamına gelir
+ Sonuna geldiği yapının en az bir defa olmak üzere istediği kadar tekrar edebileceği anlamına gelmektedir.
? Sonuna geldiği yapının ya hiç tekrar etmemesi yada bir kere tekrar edebileceği anlamına gelmektedir.
{3} Süslü parantez içindeki sayı kadar kendinden önceki yapının tekrar etmesi gerekir
{1,4} Süslü parantez içindeki sayılardan ilki en az ikincisi en fazla sayıda kendinden önceki yapının tekrar edebileceğni göstermektedir.
*? Kendinden önceki yapının en az sayıda eşleşmesini alır.
Şu şekilde örnekler üzerinden gidecek olursak;
public class main {
 
	public static void main(String[] args) {
 
		String EXAMPLE_TEST = "Bu, içerisinde regular expression ifadelerini test edebileceğim örnek bir test cümlesidir";
 
		//. (nokta) herhangi bir karakter gelebileceğini ifade eder
		//noktadan sonra gelen * ise bu noktanın istediği kadar eşleşebileceği anlamına gelir
		//daha sonra "içerisinde" stringi bulunur
		//daha sonra yine .* kullanılarak sonunda istediği kadar karakter gelebilir.,
		//Bu ifade bizim test stringimize uyduğu için true ifadesi döner.
		//true
		System.out.println("1->"+EXAMPLE_TEST.matches(".*içerisinde.*"));
 
		//"içerisinde" kelimesinden sonra .* 'ı siliyorum. Böylece "içerisinde" kelimesinden 
		//sonra hiçbir şey gelmemesi gerekiyor.
		//false
		System.out.println("2->"+EXAMPLE_TEST.matches(".*içerisinde"));
 
		//"cümlesidir" kelimesi zaten sonda olduğu için "cümlesidir" kelimesinden sonra herhangi
		//birşey kabul etmiyoruz.
		//true
		System.out.println("3->"+EXAMPLE_TEST.matches(".*cümlesidir"));
 
 
 
	}
 
}

ve bazı örnek metodlar

public class StringMatcher {
 
	// Gelen string "true" ise doğru döndürür
	public boolean isTrue(String s) {
		return s.matches("true");
	}
 
	// Gelen string "true" yada "True" ise doğru döndürür
	// Çünkü ilk karakter [tT] şeklinde yazılmış. Yani küçük t veya büyük T den
	// birini seçecek
	public boolean isTrueVersion2(String s) {
		return s.matches("[tT]rue");
	}
 
	// Gelen string "true", "True", "yes" yada "Yes" ise doğru döndürür
	// | işareti ile iki seçenek sunulmuş ya sol taraf eşleşecek, ya sağ taraf
	// sol taraf eşleşir ise ilk harfi ya t ya da T olmak zorunda
	// eğer ikinci taraf eşleşir ise ilk harf ya y yada Y olmaz zorunda.
	public boolean isTrueOrYes(String s) {
		return s.matches("[tT]rue|[yY]es");
	}
 
	// Eğer gelen stringin içerisinde "true" geçiyorsa doğru döndürür. Çünkü
	// "true" ifadesinden öncde . kullanılmış. Bu herhangi bir karakter demek
	// noktadan sonra gelen * ile bu karakterlerden istediği kadar olabilir
	// demek. Aynı yapı sonda da mevcut
	public boolean containsTrue(String s) {
		return s.matches(".*true.*");
	}
 
	// Eğer gelen string 3 tane küçük veya büyük harf içeriyorsa doğru döner.
	// Gelen string 3 karakter olmalı ve a-z yada A-Z içermeli, başka bir
	// karakter olursa false döner
	// Bu yapıya alternatif şu şekilde de yazılabilir.
	// return s.matches("[a-Z][a-Z][a-Z]");
	public boolean isThreeLetters(String s) {
		return s.matches("[a-zA-Z]{3}");
 
	}
 
	// Returns true if the string does not have a number at the beginning
	// ^ karakteri stringin başından bahsettiğimiz anlamına geliyor. Arkasından
	// [^\\d] rakam olmayacağı anlamına geliyor. Daha sonraki .* ile istediği
	// kadar karakter gelebilir. Bu da demek oluyor ki bizim stringimizin
	// başında bir tane rakamdan oluşan karakter bulunmayacak.
	public boolean isNoNumberAtBeginning(String s) {
		return s.matches("^[^\\d].*");
	}
 
	// Burada bulunan yapı [ab]|[cd] ya sol taraf ya sağ taraf seçilecek
	// anlamına gelmektedir. Sol taraf seçilirse a veya b olacak, sağ taraf
	// seçilirse d veya e olacak. Sonunda ise bu yapı ()* içerisine alındığı
	// için bu koşulu sağlayan istediği kadar tekrar edebilir anlamına
	// gelmektedir. yani "abacdacd" bu metodda true döner
	public boolean isIntersection(String s) {
		return s.matches("([ab]|[cd])*");
	}
 
	// Bu yapıda kalıbımız ya asd ile başlayıp devam edecek yada a ile
	// başlamadan herhangi bir karakter ve arkasından d karakteri gelecek ve
	// devamında 3 tane karakter gelebilir. Bu bu düzen genel parantez içinde
	// olduğundan istediği kadar devam edebilir.
	public boolean isSpecial(String s) {
		return s.matches("(asd.*|[^a]d.{3})*");
	}
 
	// Eğer gelen sayı 300 den küçükse true döner
	// İlk olarak [^0-9]* yapısı ile sayı haricinde istediği kadar karakter
	// gelebilir. sonrasında [12]? ile 1 veya 2 ya olacak ya hiç olmayacak.
	// Sonrasında [0-9]{1,2} yapısı ile en az bir en fazla iki rakam gelecek.
	// Sonunda ise [^0-9]* yapısı ile rakam harici karakterler istediği kadar
	// gelebilir.
	public boolean isLessThenThreeHundret(String s) {
		return s.matches("[^0-9]*[12]?[0-9]{1,2}[^0-9]*");
	}
}

Temel olarak düzenli ifadelere basit örnekler verdik. Sonra ki yazımda daha karmaşık örnekler üzerinde duracağız. Herkese iyi günler.

<<< Önceki:

Sonraki: >>>


Facebookta Paylaş

3 yorum »

Yorum Bırakın!

Yorum yaz, yada kendi sitende trackback (Geri besleme) olarak ekle. Ayrıca RSS ile bu konuya üye olabilirsin. .

Nazik olun. Temiz tutun. Konu dışına çıkmayın. Spam yaratmayın.

Bu tagları kullanabilirsiniz:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Bloğumuz gavatarı desteklemektedir. Kendi gavatarınızı edinmek için lütfen Gravatar a üye olun.