Matcher, 어렵지 않게 사용하기

2020. 8. 24. 01:52Spring/Java

이번에는 지난 포스팅에 이어 Matcher 객체에 대해 알아볼까합니다.

지난 포스팅에서는 Pattern 객체를 알아보았죠 〰️ 

 

****************  참고  *****************

<🎡 정규식 사용하기1부 - 기본 >

<🤖 정규식 사용하기 2부 - 심화>

******************************************** 


🔥 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 객체에 대한 포스팅은 이것으로 마치겠습니다 〰️ 

'Spring > Java' 카테고리의 다른 글

Masking Name with Regex, in java  (0) 2022.05.29
Java Date & Time, 제대로 사용하기  (2) 2022.05.22
ENUM, Clean Code with Java  (0) 2022.05.11
Pattern, 어렵지 않게 사용하기  (2) 2020.08.18
HashMap, 어렵지 않게 사용하기  (3) 2020.07.06