Matcher, 어렵지 않게 사용하기
이번에는 지난 포스팅에 이어 Matcher 객체에 대해 알아볼까합니다.
지난 포스팅에서는 Pattern 객체를 알아보았죠 〰️
**************** 참고 *****************
********************************************
🔥 Matcher Class
지난 포스팅에서는 Pattern 객체가 가진 메소드를 알아보았습니다.
이번에는 matcher객체의 method를 알아보도록 할건데요.
matcher class도 java.util.regex 패키지에서 포함하고 있습니다.
🧷 find ()
✔️ public Boolean find([int start])
대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동합니다.
예시는 아래의 appendReplacement()를 소개할 때 같이 확인하세요 ❗️
🧷 appendReplacement ()
✔️ public Matcher appendReplacement(StringBuffer sb, String replacement)
문자열과 패턴이 일치하는 위치에 replacement를 대체하는 method입니다.
아래의 예시를 보면 이해가 잘될 것 같아요.
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = "a*b";
String INPUT = "aabfooaabfooabfoo";
String REPLACE = "-";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
StringBuffer buffer = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(buffer, REPLACE);
}
matcher.appendTail(buffer);
System.out.println(buffer.toString()); // -foo-foo-foo
}
}
matcher.find() 로 매칭되는 위치로 이동한 다음, REPLACE 문자로 바꾼 후 buffer에 저장하는 것을 확인할 수 있습니다.
아래를 보면 matcher.appendTail method를 확인할 수 있는데요.
왜 사용하는지 바로 아래에서 확인해보도록 하겠습니다.
🧷 appendTail ()
✔️ public Matcher appendTail (StringBuffer sb)
위의 예시에서 appendReplace method를 사용해서 buffer에 저장했습니다.
그 과정을 차근차근 볼까요?
aabfooaabfooabfoo -> 'aab'foo'aab'foo'ab'foo
일단 위의 문자열를 보면 총 3곳을 대체해야 것을 확인할 수 있겠죠?
첫 번째, find()가 제일 첫 번째에 있는 'aab'를 찾아서 '-'로 대체할 것입니다.
그럼 buffer는 아래와 같습니다.
-
두 번째, 두 번째로 find() 가 진행되어 두 번째 'aab'를 '-'로 교체합니다.
buffer는 아래와 같아집니다.
-foo-
세 번째, 자 그럼 세 번째 find()가 실행되면 어떻게 될까요?
-foo-foo-
while문은 이대로 끝납니다.
find로 찾을 문자열이 없으니 붙이지 않는게 이해가시나요?
그래서 나머지 꼬리를 붙이기 위한 method를 사용한 것입니다.
🧷 group ()
✔️ public String group ([int group | string name])
매칭된 부분을 반환합니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = "a*b";
String INPUT = "aabfooabfooaabfoo";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
while (matcher.find()) {
System.out.println(matcher.group());
}
}
}
대상 문자열 "aabfooabfooaabfoo"과 패턴 "a*b"의 일치하는 경우는 3번 일어납니다.
따라서, 위의 while문은 find method에 의해 3번 돌고 group method에 의해 매칭되는 3개의 문자열을 반환하여 출력합니다.
aab
ab
aab
가 순서대로 출력되죠.
🧷 start ()
✔️ public int start ([int group])
매칭된 그룹의 시작 인덱스를 반환합니다.
"aabfooabfooaabfoo"라는 문자열과 "a*b"패턴을 두고 생각해보았을 때,
start가 반환하는 정수는 아래의 그림과 같습니다.
더 자세한 예시는 아래의 코드를 보면 이해가실 것 같아요.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = "a*b";
String INPUT = "aabfooabfooaabfoo";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
while (matcher.find()) {
System.out.println(matcher.start());
}
}
}
🧷 end ()
✔️ public int end ([int group])
매칭된 그룹의 끝나는 곳의 다음 인덱스를 반환합니다.
end method가 반환하는 건 아래의 그림에서 보여지듯이 3, 8, 14입니다.
예시를 통해 같이 알아보도록 할게요.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class regex {
static public void main(String[] args) {
String REGEX = "a*b";
String INPUT = "aabfooabfooaabfoo";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(INPUT);
while (matcher.find()) {
System.out.println(matcher.end());
}
}
}
그럼 Java의 Matcher 객체에 대한 포스팅은 이것으로 마치겠습니다 〰️