자바 스트링 관련 함수 중 특정 문자열을 원하는 문자열로 치환하는 함수
- replace()
String replace(CharSequence target, CharSequence replacement);
- replaceAll()
String replaceAll(String regex, String replacement);
+) replaceFirst()
처음 발견한 문자만 치환하고 싶은 경우
String replaceFirst(char oldFirstChar, char newFirstChar);
String str1 ="aaaa";
System.out.println(str1.replace("aa", "b")); //bb
System.out.println(str1.replaceAll("aa", "b")); //bb
위의 예제만 보면 두 함수의 차이점은 없어 보이지만,두 함수의 가장 큰 차이점은 입력 인자 값의 형
에 있다. replace()는 CharSequence
이고 replaceAll()는 String
이라는 것, 이때 String이라는 것은 regular expression 즉, 정규 표현식이라고 부르는 형식의 인자값을 사용
할 수 있다.
String str2 = "abcdefghijk";
System.out.println(str2.replaceAll("[abchij]", "z")); //zzzdefgzzzk
System.out.println(str2.replace("a", "z").replace("b", "z").replace("c", "z").replace("h", "z").replace("i", "z").replace("j", "z")); //zzzdefgzzzk
// 정규표현식을 활용해 원하는 문자열을 제외하고 치환
System.out.println(str2.replaceAll("[^abchij]", z)) // abczzzzhilz
위처럼 여러 문자를 한번에 치환하기 원하는 경우, replace() 함수를 통해 작업을 할 순 있지만 번거롭다. 이러한 경우 replaceAll() 함수와 정규표현식을 활용하면 쉽게 구현할 수 있다. 추가적으로 실제 대상 문자열이 어떤 형태인지 모를 경우 replace() 함수만을 사용하하여 문자열 치환을 구현하기 어렵다. 이러한 불특정 입력값을 변환하고자 할 경우 replaceAll()을 활용한다.
그렇다면, replaceAll()이 replace()보다 더욱 큰 범위의 함수같은데 이것만 사용하면 되지 않나?
하는 의문이 생길 수 있다.
그러나 오히려 예제 1번과 같이 단순한 경우 replaceAll()을 사용할 경우 replace()보다 연산 속도가 느리다[알고리즘 결과 참고]. 또한 정규표현식을 사용하지 않고 간단한 구문을 구현하고 싶은 경우 사용하면 좋다.
String str3 ="aa..bbcc"; System.out.println(str.replace(".", "dd")); // aaddddbbcc System.out.println(str.replaceAll(".", "dd")); // dddddddddddddddd
위의 결과의 차이는 replaceAll()에서 "."을 정규표현식으로 인지하여 모든 문자열을 가리켜 모든 문자열이 바뀐걸 확인할 수 있다. 위 처럼 두 함수의 차이를 모르고 사용할 경우 원치 않는 결과를 얻을 수 있다!
String str4 ="010-01@@-@@@@"; // 두 문자를 하나의 문자로 치환하고자 하는 경우 System.out.println(str.replace("-", "*").replace("@", "*")); // 010*01******* System.out.println(str.replaceAll("[-@]", "*")); // 010*01******* // 두 문자를 각 각의 다른 문자로 치환하고자 하는 경우 System.out.println(str.replace("-", "*").replace("@", "0")); // 010*0100*0000 System.out.println(str.replaceAll("[-]", "*").replaceAll("[@]" , "0")); // 010*0100*0000 System.out.println(str.replaceAll("-", "*").replaceAll("@" , "0")); // 010*0100*0000
replaceAll()은 정규표현식을 사용하기 때문에 특수문자는 치환이 안된다는 블로그들이 있었다. 그러나 직접 해본 결과 잘 변하는 것을 확인할 수 있다. 또한 위의 예제를 통해
-
와@
를 모두 한번에 같은 문자열로 치환할 경우 replaceAll()이 간단하지만,-
와@
각각 치환하고자 하는 문자가 다를 경우 replace()를 사용하는게 간단하고 좋은 것 같다.두 함수의 차이를 알고 상황에 맞게 용도에 맞게 더욱 적합한 것을 사용하자! 🌟
Ref.
jamesdreaming
ReA's 기술블로그