자바의 정규 표현식 관련한 클래스인 Pattern 클래스와 Matcher 클래스에 대해 알아보도록 하겠습니다.
간단한 예제를 통해서 알아보도록 하겠습니다.
이 예제는 original 문자열에서 life라는 단어를 대문자로 치환해주는 코드입니다.
정규표현식에 대한 자료가 아니기 때문에, 정규표현식은 간단하게 life를 사용했습니다.
자세한 정규표현식은 다른 자료를 참조하시길 바라며.. 그럼 예제를 살펴보겠습니다.
package com.may.study.reg; import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegExpr { public static void main(String[] args) { String original = "You talk about life and talk about death everything between,\n" + "like life is nothing."; Pattern pattern = Pattern.compile("life"); Matcher matcher = pattern.matcher(original); StringBuffer sb = new StringBuffer(); while (matcher.find()) { matcher.appendReplacement(sb, matcher.group().toUpperCase()); } matcher.appendTail(sb); System.out.println(sb); }
}
사용된 메소드에 대해 설명드립니다.
Pattern 클래스
Pattern compile(String regex)
인자로 주어진 정규표현식을 Pattern 클래스로 컴파일 해줍니다.
Pattern 클래스
Matcher matcher(CharSequence input)
주어진 패턴과 일치하는 것들에 대한 정보를 담는 Matcher 객체를 생성합니다.
Matcher 클래스
boolean find()
패턴과 일치하는 목록이 있으면 true, 아니면 false를 리턴합니다. 한번 호출될 때 마다 다음 일치하는 목록으로 이동합니다.
그러므로 일치하는 항목 갯수 만큼 true를 리턴하게 되고 위의 예제에서는 2번 true를 리턴하고 3번째에는 false를 리턴합니다.
Iterator 클래스의 next() 메소드와 비슷하게 동작한다고 생각하시면 됩니다.
주의하실 것이 있는데..
밑에서 설명되는 group메소드나 appendReplacement메소드는 모두 find 메소드를 통해 이동된 패턴 매칭 부분에 대해 기능이 수행됩니다.
String group()
현재 Matcher 객체가 가르키고 있는 일치하는 부분을 리턴합니다. 위 예제에서는 life를 리턴하게 됩니다.
Matcher appendReplacement(StringBuffer sb, String replacement)
주어진 StringBuffer에 현재 Matcher 객체가 가르키고 있는 일치하는 부분까지, 일치하는 부분은 replacement 값으로 대체하여 붙여넣습니다.
조금 이해가 어려울 수 있는 부분인데요. 밑의 예제 실행 설명을 보시면, 잘 이해되실 듯 합니다.
이 메소드를 사용하는 목적은 원래의 문자열에서 패턴 매칭되는 부분을 특정하게 바꾸어서 다른 문자열을 만들고자 함입니다.
StringBuffer appendTail(StringBuffer sb)
이 메소드는 아래 코드 동작 설명을 통해 설명드리겠습니다.
그러면 예제의 동작에 대해 상세하게 설명드리겠습니다.
while 문 전까지의 동작은 간단합니다. original 문자열에서 life 패턴을 찾기위해 Pattern 클래스와 Matcher 클래스를 생성합니다.
while 문에서는 origianl 문자열의 life를 LIFE로 바꿔주기 위한 동작을 수행하는데요..
첫번째 find() 메소드 호출에서는 true가 리턴되고 matcher 객체는 원래 문자열에서 첫번째 life 부분을 가르키게 됩니다.
matcher.group 은 life를 리턴합니다. 그리고 이것을 대문자로 바꾸어서 sb에 붙여넣습니다.
그러면 이 시점에서 sb에는 어떤 값이 들어있을까요?
You talk about LIFE
여기까지 값이 들어있게 됩니다. 패턴 매칭되는 부분까지 붙여넣게됩니다. 그러면 두번째 반복문이 처리된 후에는?
You talk about LIFE and talk about death everything between,\nlike LIFE
이렇게 값이 들어가게 됩니다.
그리고 matcher.appendTail(sb); 이 구문이 실행되면 나머지 부분이 붙여져서..
You talk about LIFE and talk about death everything between,\nlike LIFE is nothing.
이렇게 완성됩니다.
'개발 > 자바' 카테고리의 다른 글
JSON 스키마 (0) | 2017.06.30 |
---|---|
JSON STREAMING API (0) | 2017.06.30 |
FileLock (0) | 2017.01.11 |
checked exception과 unchecked exception (0) | 2016.07.18 |
Mybatis 쿼리 파라미터에서 jdbcType (0) | 2016.07.08 |