Pure Java – 65 Searching – Pattern & Matcher

Merhaba Arkadaslar,
Bu bolumde java.util.regex.Matcher , java.util.regex.Pattern  siniflari yardimi ile searching/finding konusunu inceleyecegiz.

Regex konusu Java’ya ozgu bir konu degildir. Diger programlama dillerinde de bulunur. Daha iyi anlamak icin kucuk kucuk orneklerle baslayalim.

Pattern sinifinda yer alan compile metoduna arayacagimiz regex’i yaziyoruz.
Matcher sinifinda yer alan matcher metoduna icerisinde arama yapilacak String literali/degeri veriyoruz.(content)

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaRegexTest {

	public static void main(String[] args) {
		Pattern p = Pattern.compile("t");
		// ilgili icerikte/content "injavawetrust" t harfini arayacagiz.
		Matcher m = p.matcher("www.injavawetrust.com");

		while (m.find()) {
			System.out.print(m.start() + " ");
		}

		System.out.println();
		Pattern p2 = Pattern.compile("ja");
		// arama tek karakter olarak degil birden fazla karakter kalibi/patterni
		// seklinde olabilir/
		// burada igili icerikte "ja" literalini arayacaktir.
		Matcher m2 = p2.matcher("www.injavawetrust.com");

		while (m2.find()) {
			System.out.print(m2.start() + " ");
		}

		System.out.println();
		Pattern p3 = Pattern.compile("j|t|w");
		// arama yaparken or/veya yapisini kullanabiliriz. | karakteri ile
		// yapabiliriz.
		Matcher m3 = p3.matcher("www.injavawetrust.com");

		while (m3.find()) {
			System.out.print(m3.start() + " ");
		}

		System.out.println();
		Pattern p4 = Pattern.compile("[jwt]");
		// Veya/or yapisi icin | karakterini kullanabildigimiz gibi [ ] seklinde
		// de kullanabiliriz.
		// [jwt] ---> [j|w|t] ile aynidir.
		Matcher m4 = p4.matcher("www.injavawetrust.com");

		while (m4.find()) {
			System.out.print(m4.start() + " ");
		}

		System.out.println();
		Pattern p5 = Pattern.compile("[jwt][er]");
		// aradigimiz pattern yapisinda ilk karakterden sonra(j veya w veya t)
		// e veya r gelmesini istiyoruz.
		Matcher m5 = p5.matcher("www.injavawetrust.com");

		while (m5.find()) {
			System.out.print(m5.start() + " ");
		}

		System.out.println();
		Pattern p6 = Pattern.compile("[a-i]");
		// Araya tire (-) koyarak da or | yapabiliriz.
		// bunun anlami a|b|c|d..|i seklindedir.
		Matcher m6 = p6.matcher("www.injavawetrust.com");

		while (m6.find()) {
			System.out.print(m6.start() + " ");
		}

		System.out.println();
		Pattern p7 = Pattern.compile("[1-5]");
		// benzer sekilde sayilar icin de yapabiliriz.
		Matcher m7 = p7.matcher("56782");

		while (m7.find()) {
			System.out.print(m7.start() + " ");
		}

		System.out.println();
		Pattern p8 = Pattern.compile("[^ajw]");
		// caret karakterini kullanabiliriz. bunun anlami a|j|w disindaki
		// karakterleri bul demektir.
		Matcher m8 = p8.matcher("www.injavawetrust.com");

		while (m8.find()) {
			System.out.print(m8.start() + " ");
		}

	}
}

Simdi de su ornegi inceleyelim;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaRegexTest2 {

	public static void main(String[] args) {

		Pattern p = Pattern.compile("ab");
		Matcher m = p.matcher("abababa");

		while (m.find()) {
			System.out.print(m.start() + " ");
		}

		// bu islem bir kere calisir. Buradaki dongu calismayacaktir !
		while (m.find()) {
			System.out.print(m.start() + " ");
		}

		System.out.println();
		Pattern p2 = Pattern.compile("aba");
		Matcher m2 = p2.matcher("abababa");

		while (m2.find()) {
			System.out.print(m2.start() + " ");
			// burada 2 tane sonuc dondurecektir. baslangic indexi 0 ve 4 olacak
			// sekilde.
			// baslangic indexi 2 olan dahil edilmez. Cunku idexi 0 olan aba
			// degerine 2.index de dahil.
			// Regex islemesi soldan saga olur ve genel olarak kullanilan bir
			// index bir daha kullanilmaz.

			// aba 0 3
			// aba 4 7 seklinde olur
			// aba 2 5 kullanilmaz!
		}
	}
}

Searches Using Metacharacters
Arama islemlerinde Metacharacter kullanabiliriz bunlar ;

\d digit
\s whitespace(bosluk)
\w harf,rakam ya da alt cizgi
\D non-digit
\S non-whitespace
\W non-word
. the dot/nokta metacharacter

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaRegexMetaCharTest {

	public static void main(String[] args) {

		Pattern p = Pattern.compile("\\d");
		// \d --> [0-9] anlamina gelmektedir.
		Matcher m = p.matcher("java1 reg2ex!");

		while (m.find()) {
			System.out.print(m.start() + " ");
		}

		Pattern p2 = Pattern.compile("\\D");
		// \D non-digit anlamina gelmektedir --> [^0-9]
		// bosluk karakterini almaz!
		Matcher m2 = p2.matcher("java1 reg2ex!");

		System.out.println();
		while (m2.find()) {
			System.out.print(m2.start() + " ");
		}

		Pattern p3 = Pattern.compile("\\s");
		// \s --> space bosluk karakterini bulur.
		Matcher m3 = p3.matcher("java1 reg2ex!");

		System.out.println();
		while (m3.find()) {
			System.out.print(m3.start() + " ");
		}

		Pattern p4 = Pattern.compile("\\S");
		// \S --> non-space anlamina gelir --> [^\s]
		Matcher m4 = p4.matcher("java1 reg2ex!");

		System.out.println();
		while (m4.find()) {
			System.out.print(m4.start() + " ");
		}

		Pattern p5 = Pattern.compile("\\w");
		// \w --> harf veya rakam
		Matcher m5 = p5.matcher("java1 reg2ex!");

		System.out.println();
		while (m5.find()) {
			System.out.print(m5.start() + " ");
		}

		Pattern p6 = Pattern.compile("\\W");
		// \W non-word --> ozel karakterler bosluk vs
		Matcher m6 = p6.matcher("java1 reg2ex!");

		System.out.println();
		while (m6.find()) {
			System.out.print(m6.start() + " ");
		}

		Pattern p7 = Pattern.compile("a.c");
		// . nokta metakarakteri
		// "buraya herhangi bir karakter gelebilir demektir"

		// nokta metacharacteri kullanirken \\. seklinde kullanmiyoruz.
		// \\. metacharacter degildir nokta karakterini temsil eder.
		Matcher m7 = p7.matcher("ac abc a c a  d");
		// ac yi almaz cunku arada bir karakter yok.
		// abc
		// a c ise alir.
		// a d almaz arada 2 karakte bosluk var.
		System.out.println();
		while (m7.find()) {
			System.out.print(m7.start() + " ");
		}

	}
}

Quantifiers
Quatifier, aranan elemanlarin/karakterlerin kac defa gececegi bilgisini belir.

* 0 veya daha fazla –> {0,}
+ 1 veya daha fazla –> {1,}
? 0 veya 1 tane –> {0,1}
{X} X sayisi kadar
{X,} X veya daha fazla
{X,Y} minimum X maximum Y kadar

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class JavaRegexQuantifierTest {
	public static void main(String[] args) {

		Pattern p = Pattern.compile("\\d");
		Matcher m = p.matcher("1 a12 234b");

		while (m.find()) {
			System.out.println("start : " + m.start() + " end :" + m.end() + " content:" + m.group());
			// start metodu match/eslesen regex icin baslangic indexi verir.
			// end metodu match/eslesen regex icin baslangic indexi verir.
			// group metodu match/eslesen regexi verir.
		}

		Pattern p2 = Pattern.compile("\\d+");
		// + karakteri 1 veya daha fazla anlamina gelir.
		Matcher m2 = p2.matcher("1 a12 234b");
		System.out.println("one or more");
		while (m2.find()) {
			System.out.println("start : " + m2.start() + " end :" + m2.end() + " content:" + m2.group());
			// Burada dikkat edilecek olursa \d+ olarak kullanildi.
			// 12 veya 234 kisminda yanyaya birden fazla rakam geldigi icin
			// bunlari birlikte degerlendirir.
			// araya bosluk geldigi zaman ayirir.
		}

		// Pattern p3 = Pattern.compile("a\\d?");
		// ? karakteri 0 veya 1 anlamina gelir.

		Pattern p3 = Pattern.compile("a\\d+");

		Matcher m3 = p3.matcher("1a123  ax");
		System.out.println("one or more 2");
		while (m3.find()) {
			System.out.println("start : " + m3.start() + " end :" + m3.end() + " content:" + m3.group());
			// a\\d? anlami a dan sonra 0 veya 1 tane digit/sayi varsa
			// a\\d+ anlami a dan sonra 1 veya daha fazla digit/sayi varsa
		}

		Pattern p4 = Pattern.compile("\\d{3}");
		Matcher m4 = p4.matcher("1a123 ax");
		System.out.println("3digits");
		while (m4.find()) {
			System.out.println("start : " + m4.start() + " end :" + m4.end() + " content:" + m4.group());
		}

		Pattern p5 = Pattern.compile("0[xX][0-9a-fA-F]");
		// 0 ile baslasin 2.karakter x veya X olsun sonrasinda rakam(0-9) ya da a-f ya da A-F arasinda harf olsun.
		Matcher m5 = p5.matcher("12 0x 0x12 0Xf 0xg");
		System.out.println("more regex");
		while (m5.find()) {
			System.out.println("start : " + m5.start() + " end :" + m5.end() + " content:" + m5.group());
		}

	}
}

Greedy Quantifiers
* ? + quatifier’lari acgozlu/greedy davranabilir. Reluctant/isteksiz ozelligi icin ? karakterini ekleriz.

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class GreedyQuantifiersTest {

	public static void main(String[] args) {

		Pattern p = Pattern.compile(".*xx");

		// regexi inceledigimizde xx ile bitmesini istiyoruz ve oncesinde
		// herhangi bir karakter olabilir diyoruz.
		// Daha once belirtigimiz gibi regex mekanizmasi soldan saga dogru
		// calisir.
		Matcher m = p.matcher("yyxxxyxx");

		while (m.find()) {
			System.out.println(m.start() + " " + m.group());
			// burada beklentimiz
			// 0 yyxx
			// 4 xyxx seklinde fakat boyle calismayacaktir !
			// bunun yerine 0 yyxxxyxx seklinde bir cikti verecektir.
			// Bunun nedeni regex mekanizmasi greedy/acgozlu davranmaktadir. tum
			// icerige bakar sagdan itibaren en cok eslesecek sekilde alir.
		}

		// * greedy/acgozlu *? reluctant/isteksiz
		// ? greedy/acgozlu ?? reluctant/isteksiz
		// + greedy/acgozlu +? reluctant/isteksiz

		Pattern p2 = Pattern.compile(".*?xx");
		//burada reluctant/isteksiz calisactir.
		Matcher m2 = p2.matcher("yyxxxyxx");

		while (m2.find()) {
			System.out.println(m2.start() + " " + m2.group());
		}
	}
}

Not: Bu yaziya ilerleyen donemlerde eklemeler yapilacaktir. Simdilik bukadar !

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *