자바에서 replaceAll(regex, replacement)
는 문자열에서 정규식과 일치하는 문자열을 찾아 replacement
로 바꾸어주는 메소드이다.
replaceAll()
은 내부적으로 Matcher.appendReplacement()
를 사용하는데 Matcher
에서 사용했던 것과 유사하게 그룹핑을 통해 일치하는 문자열을 골라 커스텀이 가능하다. ([Java] Pattern, Matcher Class 사용법과 메소드 정리)
System.out.println("abcdefg".replaceAll("\\w", "*"));
// *******
기본적으로 사용하면 String.replaceAll()을 사용한다면 위와 같은 형태로 출력이 가능하다.
주어진 \\w
과 일치하는 문자열을 모두 찾아 *
로 변환하는 것이다. 하지만 검색된 문자열을 사용하고 싶다면 달러 기호($
)를 사용하면 된다.
달러 기호는 Matcher.group()
과 유사한데, 기호 뒤에 등장하는 값이 메소드의 파라미터와 같다고 생각하면 이해하기 편하다.
System.out.println("a1b2c3d4".replaceAll("[a-z]","($0)"));
// (a)1(b)2(c)3(d)4
만약 알파벳마다 괄호를 적용하고 싶다면 $0
를 사용하면 되는데 이것은 Matcher.group(0)
, 즉 일치하는 모든 그룹의 문자열을 가져온다. 그렇게 받아온 문자열을 사용해 원하는대로 변경이 가능해진다.
또한 그룹핑도 가능한데, naming 방식과 index 방식을 모두 지원한다.
System.out.println("01012345678".replaceAll("(\\d{3})(\\d{4})(\\d{4})", "$1-$2-$3"));
// 010-1234-5678
$g
는 g
번째 그룹을 가져오게 되고 차례로 숫자 3개, 숫자 4개, 숫자 4개에 해당하는 그룹을 가지게 된다.
System.out.println("20210101".replaceAll("(?<year>\\d{4})(?<month>\\d{2})(?<day>\\d{2})",
"${year}년 ${month}월 ${day}일"));
// 2021년 01월 01일
${name}
을 통해 네이밍으로 그룹핑된 문자열을 직관적이게 가져올 수도 있다.
만약 달러 기호를 그대로 사용하고 싶다면 \\$
를 사용하면 된다.
'Programming > Java' 카테고리의 다른 글
[Java] 병렬 데이터 처리(병렬 스트림, 포크/조인 프레임워크) (0) | 2021.05.21 |
---|---|
[Java] 스트림(Stream) 활용 (0) | 2021.05.13 |
[Java] 스트림(Stream) (0) | 2021.05.11 |
[Java] 람다(lambda) (0) | 2021.05.06 |
[Java] Boxing, Unboxing (0) | 2021.05.05 |