Java Puzzle 15 – String Replacement & Separator

Merhaba Arkadaslar

  • java.lang.String replaceAll , replace
  • java.util.Matcher.quoteReplacement ,
  • java.util.Pattern.quote
  • java.util.File.separator , java.util.File.separatorChar
    gibi metotlari ve degiskenleri inceleyecegiz .

ReplaceAll.java

package _15.string.replace;

public class ReplaceAll {

	public static void main(String[] args) {
		
		String className = ReplaceAll.class.getName();
		
		System.out.println(className);
		System.out.println(className.replaceAll(".", "/"));
		
	}
}

Ornegimizi calistirdigimizda;

_15.string.replace.ReplaceAll
/////////////////////////////

Burada yapmak istedigimiz className’de yer alan nokta(.) karakterlerini / karakteri ile degistirmek.
Fakat tum karakterler / karakteri olarak degisti , peki neden ?

Bunun nedeni replaceAll metodundaki ilk parametre regex olarak ifade edilir. nokta (.) karakteri tek basina kullanildiginda meta character olarak ifade edilir. Herhangi bir karakter anlamina gelmektedir. Bu nedenle ilgili String literalindeki tum karakterler / karakteri ile degistirilir. Nokta karakterini ifade etmek icin (\.) seklinde kullanmamiz gereklidir.

    public String replaceAll(String regex, String replacement) {
        return Pattern.compile(regex).matcher(this).replaceAll(replacement);
    }

ReplaceAll.java

package _15.string.replace;

public class ReplaceAll {

	public static void main(String[] args) {
		
		String className = ReplaceAll.class.getName();
		
		System.out.println(className);
		System.out.println(className.replaceAll(".", "/")); //Meta character
		System.out.println(className.replaceAll("\\.", "/")); // the dot character
	}
}

Ornegimizi calistirdigimda ;

_15.string.replace.ReplaceAll
/////////////////////////////
_15/string/replace/ReplaceAll

Bu tarz hatalari gozden kacirmamak icin java.util.Pattern.quote metodunu kullanabiliriz. Pattern.quote metodunu kullandigimizda Meta character ve escape karakterlerinin ozel bir anlami olmayacaktir.

System.out.println(className.replaceAll(Pattern.quote("."), "/"));

Bir baska nokta olarak ,slash(/) karakteri Unix based sistemlerde separator olarak kullanilmaktadir. Windows icin bu back-slash karakteridir (\).
Platform bagimsiz olmasi icin File.separator degiskenini kullanabiliriz.

FileSeparator.java

package _15.string.replace;

import java.io.File;
import java.util.regex.Pattern;

public class FileSeparator {

	public static void main(String[] args) {
		
		String className = FileSeparator.class.getName();
		System.out.println(className.replaceAll(Pattern.quote("."), File.separator));

	}
}

Bununla birlikte bu ornegimizi Windowsta calistirdigimizda Exception aliriz.
Linux dagitimi kullandigim icin herhangi bir Exception almiyorum , Windows makinede denedigimde ;

Exception in thread "main" java.lang.IllegalArgumentException: character to be escaped is missing
	at java.util.regex.Matcher.appendReplacement(Unknown Source)
	at java.util.regex.Matcher.replaceAll(Unknown Source)
	at java.lang.String.replaceAll(Unknown Source)
	at _15.string.replace.FileSeparator.main(FileSeparator.java:19)

Bunun nedeni File.separator Windows icin back-slash karakteridir(\)
back-slash karakteri (\) escape karakteridir , tek basina invalid/gecersiz olacaktir. Bu problemi cozmek icin java.util.regex.Matcher.quoteReplacement metodunu kullanabiliriz.

System.out.println(className.replaceAll(Pattern.quote("."), Matcher.quoteReplacement(File.separator)));

Bir baska yaklasim olarak String.replace metodunu kullanabiliriz. Bu metod parametre olarak char almaktadir.

    public String replace(char oldChar, char newChar) {
    //....
    //...
    }

Replace.java

package _15.string.replace;

import java.io.File;

public class Replace {
	public static void main(String[] args) {
		String className = FileSeparator.class.getName();
		
		//UNIX systems /
		//Microsoft Windows systems '\\'
		System.out.println(className.replace('.',File.separatorChar));
	}
}

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 *