java.util.regex.Matcher
XML을 조작해서 문서 작성을 자동화하는 프로젝트를 하다보니 정규식을 사용할 일이 아주 많아졌다. 기본적으로 Matcher 클래스의 find, group, start, end 등의 메소드만 활용하고 있었는데 편리한 메소드들이 많은 것 같아 이번 기회에 공부해보고 넘어가려 한다.
기본 사용 방법
Pattenrn PATTERN_EX = Pattern.compile('정규식');
Matcher MATCHER_EX = PATTERN_EX.matcher('검사할 문자열');
while(MATCHER_EX.find()){
System.out.println("문자열에서 정규식 패턴과 일치한 부분: " + MATCHER_EX.group());
}
System.out.println("문자열에서 정규식 패턴과 일치한 부분의 개수: " + MATCHER_EX.results().count());
MathcerResult interface는 정규식을 컴파일링하는 Pattern 클래스를 해석하여 인자로 받은 문자열을 문자 하나씩 순서대로 매칭 여부를 확인하는 기능을 수행한다. Matcher 클래스는 MatcherResult interface를 상속한 클래스이기 때문에 MatcherResult에 정의된 메소드들을 그대로 가진다. PATTERN_EX.matcher('...') 메소드가 실행되면 다음과 같은 matcher의 메소드를 사용할 수 있다.
Matcher Methods 정리
위에서 소개한 기본적인 메소드 이외에 편리한 메소드들이 아주 많다.
1. Index Methods
인덱스 메소드는 패턴과 매치되는 부분으로 나온 결과의 인덱스 정보를 반환한다.
- public int start() : 검사를 수행한 문자열에서 패턴에 매칭된 결과의 시작 문자 인덱스를 반환
- public int start(int group) : 검사를 수행한 문자열에서 패턴에 매칭된 결과의 인자로 전달된 그룹의 시작 문자 인덱스를 반환
- public int end() : 검사를 수행한 문자열에서 패턴에 매칭된 결과의 마지막 문자 인덱스를 반환
- public int start(int group) : 검사를 수행한 문자열에서 패턴에 매칭된 결과의 인자로 전달된 그룹의 마지막 문자 인덱스를 반환
2. Study Methods
이 메소드들은 패턴에 매칭되는 결과가 있는지 없는지에 대한 boolean 결과를 반환한다.
- public boolean find() : 패턴에 일치한 부분의 이후부터 순차적으로 패턴에 매칭되는 값을 다시 찾고 있으면 true를, 없으면 false를 반환한다. Pattern.matcher() 에 인자로 주어진 대상 문자열에서 해당 패턴을 검색하여 일치하는 패턴이 일부라도 존재하면 true를 반환하는 것으로, 일치하는 부분의 시작과 끝이 가변적인 것이다.
- public boolean find(int start) : 인자로 주어진 인덱스 이후부터 탐색을 시작한다.
- public boolean lookingAt() : find() 메소드와 비슷한 역할로 매칭되는 결과가 있는지 찾는 것인데 이 메소드는 인자를 따로 받지 않고, 항상 처음부터 탐색을 시작합니다. 즉, 시작이 항상 Pattern.matcher에 인자로 주어진 sequence의 처음이지만 끝은 가변적이다.
- public boolean mathces() : 이 역시 위 메소드들과 비슷한 역할을 하지만 find와 달리 시작과 끝이 모두 고정되어 있다고 보면 된다. 대상 문자열 전체의 시작과 끝이 패턴과 일치해야 true를 반환한다.
3. Replacement Methods
- public Matcher appendReplacement(StringBuffer sb, String replacement) : 패턴과 일치하는 부분에 두번째 인자로 전달한 replacement 값을 대체하여 넣는다.
이 메소드를 모를 때는 그냥 찾은 다음에 그 문자열 원본과 replace하는 방식으로 해서 아주 비효율적이었다 ㅠㅠ - public StringBuffer appendTail(StringBuffer sb) : appendReplacement로 매칭되는 부분을 찾을 때마다 replace를 하고 나면 마지막으로 매칭되는 부분 이후의 남은 꼬리 문자열은 string buffer에 담기지 않게 된다. 그래서 마지막 꼬리도 string buffer에 담기 위해서 appendTail을 해주어야 한다.
StringBuffer sb = new StringBuffer();
while (m.find()) {
m.appendReplacement(sb, "-");
}
m.appendTail(sb);
- public String replaceAll(String replacement) : 대상 문자열에 일치하는 부분을 모두 인자로 주어진 replacement로 바꾼다.
- public String replaceFirst(String replacement) : 대상 문자열에서 가장 먼저 발견된 일치하는 부분을 replacement로 바꾼다.
- public static String quateReplacement(String replacement) : 특정 문자열의 대체 문자열을 반환한다. 정규식에서 이미 예약어로 사용되고 있는 /, $와 같은 문자열들은 사용자가 입력한 그대로 입력되지 않기 때문에 이 메소드로 처리한 결과로 사용해야 합니다.
test.replaceAll(Matcher.quoteReplacement("\\"), "/");
References
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java) Comparable과 Comparator (0) | 2022.04.27 |
---|---|
Java) 정규식과 StringBuffer를 이용하여 문자열 특정 위치만 치환하기 (0) | 2022.03.24 |
Java) 랜덤 아이디 만들기 - n자리수 16진수 문자열 만들기 (0) | 2022.02.16 |
Java) 자바로 shell script 실행하기 (0) | 2022.02.10 |
Java) JSON body와 함께 HTTP POST 요청 보내기 (0) | 2022.02.07 |