자바 문자열에서 특정 문자를 다른 문자로 바꾸기 - replace, replaceAll, replaceFirst

프로그래밍/자바 2019. 8. 8. 02:00
반응형

자바언어를 사용해서 문자열내의 특정 문자를 다른 문자로 바꾸는 방법을 알아 봅니다. 이때 주의해야할 사항이 있습니다. 자바 문자열은 불변(immutable)이라는 것입니다.


자바 문자열을 불변이라서 어떤 연산에 의해 원본 문자열이 바뀌지 않습니다. 원본은 그대로 유지되고, 바뀐 문자열이 새로 생성이 되어서 반환됩니다. 그래서 항상 바뀐 문자열을 반환값으로 받아야 합니다.


String str = "ABCDE";

String text = str.replace('C', 'F');


자바 String객체에 문자열에는 문자열을 바꿀 수 있는 다음과 같은 메소드가 제공 됩니다.


- String replace(char oldChar, char newChar)

  문자열내에 있는 모든 oldChar를 newChar로 바꾼 문자열을 반환합니다.


- String replace(CharSequence target, CharSequence replacement)

  문자열내에 있는 모든 target 문자열을 replacement문자열로 바꾼 문자열을 반환합니다.


- String replaceAll(String regex, String replacement)

  문자열내에 있는 정규식 regex와 매치되는 모든 문자열을 replacement문자열로 바꾼 문자열을 반환합니다.


- String replaceFirst(String regex, String replacement)

  문자열내에 있는 정규식 regex와 매치되는 첫번째 문자열을 replacement 문자열로 바꾼 문자열을 반환합니다.



1. replace(char oldChar, char newChar) 메소드


한 문자를 다른 문자로 바꿉니다. char 타입의 인자를 받습니다.


String str = "사과가 맛있습니다. 사과가 추석에 먹습니다.";

String text = str.replace('가', '는');

System.out.println(text);


결과)

사과는 맛있습니다. 사과는 추석에 먹습니다.



2. replace(CharSequence target, CharSequence replacement) 메소드


CharSequence 객체를 인자로 받습니다. CharSequence 객체는 String 객체를 상속하는 객체이므로, 다형성에 의해 String 객체를 인자로 주어도 됩니다. 이 예제에서는 문자열을 바꿉니다.


String str = "사과는 맛있습니다. 추석에 사과를 먹습니다.";

String text = str.replace("사과", "배");

System.out.println(text);


결과)

배는 맛있습니다. 추석에 배를 먹습니다.



3. replaceAll(String regex, String replacement) 메소드


정규식을 사용하여 매치되는 문자열을 모두 바꿉니다. 이 메소드의 예제는 줄바꿈 문자를 제거하는 것으로 해보겠습니다. 이걸 사용해야 할때가 가끔 있습니다(웹 응용에서 줄바꿈 문자를 <br/> 태그로 바꿔야 할때가 가끔 있습니다).


줄바꿈 문자를 삭제하는데 replaceAll()메소드가 아니라 replace() 메소드를 사용할 수도 있습니다. 하지만 조금 복잡해집니다. 그 원인은 줄바꿈 문자가 운영체체(OS)마다 다르기 때문에 이걸 모두 처리해야 하기 때문입니다.


String text = str.replace("\r", "").replace("\n", "");


replaceAll() 메소드를 사용하면 정규식으로 처리할 수 있습니다.


String text = str.replaceAll("\\r|\\n", "");


또는


String text = str.replaceAll("[\\r\\n]+", "");


빈문자열로 바꿔 버리면 문자열이 붙어 버리므로 줄바꿈 문자를 공백 하나로 바꾸고자 할 수도 있겠습니다. 이 경우에는 위에서 한가지를 더 고려해야 합니다. 단순히 String text = str.replaceAll("\\r|\\n", " "); 로 처리하면 CRLF를 줄바꿈 문자로 사용하는 경우 공백이 두개 들어가 버립니다.


String text = str.replaceAll("\\r\\n|\\r|\\n", " ");


또는


String text = str.replaceAll("(\\r\\n)+|[\\r\\n]+", " ");


여러개의 빈줄이 연속으로 나오는 것을 하나의 공백으로 바꿀 경우 아래처럼 사용할 수 있습니다.


String text = str.replaceAll("(\n{2,})|(\r{2,})|((\r\n){2,})"," ");


그룹 캡쳐(Group Capture)와 역참조(Backreference)를 사용하면 좀 더 복잡한 바꾸기를 할 수 있습니다. 그룹은 정규식에서 소괄호를 사용해서 만들어진 부분입니다. 이 부분에는 소괄호가 열린 순서에 따라 번호가 붙는데 이것이 역참조 입니다. 이 번호를 이용해서 그룹 캡쳐 부분을 처리를 할 수 있습니다.



마침표(.)와 콤마(,) 앞에 있는 공백을 제거하는 방법 입니다.


String str = "그렇다면 , 어떻게 될까?";

String text = str.replaceAll("(\\w|[ㄱ-ㅎ가-힣]*)(\\s+)([\\.,])", "$1$3");


타이틀 태그 사이의 문자를 추출합니다.


String str = "<head><title>테스트</title></head>";

String text = str.replaceAll("(.*)(<title>)(.+?)(</title>)(.*)", "$3");



4. replaceFirst(String regex, String replacement) 메소드


처음 매칭되는 하나만 바꿉니다. 이 메소드는 간단하므로 예제를 보지 않겠습니다.


정규식을 사용하는 replaceAll() 메소드의 경우 동일한 결과를 얻는 여러가지 방법이 있을 수 있습니다. 이것저것 다른 방법을 생각해 보는것도 재미있을 것 같습니다. 그리고 실무에서는 줄바꿈 문자 앞에 whitespace가 있는 경우도 줄을 지울 수 있게 한다던가 하는 응용이 좀 필요한 경우가 많습니다. 이런 경우도 생각을 해보세요.^^

반응형

댓글을 달아 주세요