▸JAVA/라이브러리(API)

java.util.regex 주요 메소드 [1/1]

코데방 2019. 12. 10.
728x90

[ regex 패키지 ]

  • 정규표현식을 다루는 패키지​

[ Pattern 클래스]

  • 정규표현식의 컴파일된 버전​
  • 정규표현식과 원본 문자열을 객체화(Matcher class)할 수 있는 메소드 제공

[ Matcher 클래스 ]

  • ​Pattern 클래스의 메소드를 통해 객체화된 원본 문자열
  • Matcher 클래스의 객체(인스턴스)를 통해 정규표현식을 이용한 다양한 편집 가능

실제로 정규표현식을 사용하는 순서대로 정리해보겠습니다. 정규표현식에 대한 설명은 아래 두 가지 글을 참조하시면 됩니다.

 

2019/12/10 - [JAVA/기본 문법] - 정규표현식 (메타문자와 주의사항) [1/2]

2019/12/10 - [JAVA/기본 문법] - 정규표현식 (작성 방법 및 전방탐색, 후방탐색) [2/2]

 


 

[ Pattern.matches(String regex, String input) ]

  • input 문자열이 regex(정규표현식) 패턴에 맞는지 검증할 수 있음
  • 간단히 문자열로 정규표현식을 만들어서 비교 가능
  • static 메소드로 인스턴스 불필요
package study.first;

import java.util.regex.Pattern;

public class Main {
	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "[ABC][@][ABC]";

		// 검사할 문자
		String c = "A@C"; // true
		System.out.println(Pattern.matches(a, c));
	}
}

 


 

그런데 정규표현식으로 검증할 횟수가 많은 경우 매번 위와 같이 사용한다면 "Pattern.matches()" 메소드는 매번 정규표현식을 컴파일해야해서 비효율적입니다. 따라서 미리 컴파일된 정규표현식을 만들어 저장해두면 속도가 빨라지는데 이를 위한 메소드가 "Pattern.compile()" 메소드입니다. 또한 Pattern 클래스를 이용해 객체화를 시키면 regex 패키지의 다양한 메소드를 활용할 수 있습니다. 해당 메소드를 통해 컴파일 된 정규표현식을 내부적으로 가지고 있는 Pattern 타입의 인스턴스를 하나 생성합니다.

 

[ Pattern.compile(String regex) ]

  • 정규표현식을 제공하면 Pattern 타입 인스턴스를 반환
  • java.util.regex 패키지의 클래스들은 new를 통한 인스턴스 생성 불가
  • 생성된 인스턴스 안에는 컴파일 된 정규표현식이 담겨있음
  • toString() 메소드가 오버라이딩 되어 있어 인스턴스 출력 시 정규표현식 출력
package study.first;
import java.util.regex.Pattern;
public class Main {
	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "[ABC][@][ABC]";
		Pattern regex = Pattern.compile(a);
		
		System.out.println(regex);	// [ABC][@][ABC]
	}
}

 


 

Pattern 타입의 인스턴스로 만들어진 정규표현식은 Pattern.matches() 메소드의 인자값으로 넣어줄 수 없습니다. 따라서 비교할 대상도 Matcher 클래스 타입의 인스턴스로 만들어주고 두 개를 비교해줘야 합니다. Matcher 인스턴스를 만들어주는 메소드가 "인스턴스.matcher()" 메소드입니다.

 

[ Pattern 타입 인스턴스.matcher(String input) ]

  • 비교대상 문자열을 제공하면 Matcher 타입 인스턴스를 반환
  • Matcher 클래스 타입을 사용하기 때문에 Matcher 클래스도 import해줘야 함
  • 문자열에 대한 다양한 정보를 가지고 있다가 활용함
package study.first;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "[ABC][@][ABC]";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C";
		Matcher comp = regex.matcher(c);		
	}
}

 


 

이제 정규표현식을 가진 Pattern 클래스 regex 인스턴스와, 비교할 문자열을 가진 Matcher 클래스의 comp 인스턴스가 생성됐습니다. 두 가지를 비교하면 됩니다. comp는 regex의 인스턴스 메소드에서 만들어졌으므로 자신의 정규표현식을 알고 있습니다. 따라서 comp의 인스턴스 메소드만을 사용해서 정규표현식을 사용할 수 있습니다. 먼저 정규표현식에 일치하는지 여부를 확인합니다.

 

[ Matcher 타입 인스턴스.matches() ]

  • 전체 문자열이 정규표현식과 정확히 일치하는지 여부 boolean타입 반환
package study.first;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "[ABC][@][ABC]";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C";
		Matcher comp = regex.matcher(c);
		
		// 정규표현식 맞는지 비교
		System.out.println(comp.find());	// true
	}
}

 


[ Matcher 타입 인스턴스.find() ]

  • matches() 메소드와 다르게, 문자열 중 정규표현식의 규칙과 일치하는 부분을 찾아줌
  • 일치하는 부분이 있으면 true, 없으면 false를 반환함
  • 일치하는 부분의 위치를 저장하고 있다가 재실행 시 다음 위치 탐색
  • 인덱스를 제공해주면 해당 위치부터 다시 시작

package study.first;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
	
	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "([ABC][@][ABC])|([XYZ][#][XYZ])";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C매칭되지않는문자열X#Y";
		Matcher comp = regex.matcher(c);

		System.out.println(comp.find());	// true		
		System.out.println(comp.find());	// true
		System.out.println(comp.find());	// false
		System.out.println(comp.find(0));	// true
	}
}

 

 


[ Matcher 타입 인스턴스.group() ]

  • find() 메소드를 통해 찾은 문자열 내용을 반환해줌

단독으로는 사용될 수 없고 find() 메소드를 실행 후 찾은 문자열을 반환해줍니다. 여기서 group이란 정규표현식의 그룹을 의미합니다. 예시에서 괄호를 통해 "(식1) 또는 (식2)"의 형태로 묶어줬으므로, 식1이 group1이 되고 식2가 group2가 됩니다.

 

따로 argument를 주지 않으면 자동으로 일치하는 그룹의 문자열을 찾아 반환합니다. 하지만 그룹넘버를 넣어주게 되면 해당 그룹에 일치하면 문자열을 반환하고, 그렇지 않으면 null값을 반환합니다. 

 

package study.first;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
	
	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "([ABC][@][ABC])|([XYZ][#][XYZ])";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C매칭되지않는문자열X#Y";
		Matcher comp = regex.matcher(c);

		System.out.println(comp.find());   // true		
		System.out.println(comp.group());  // "A@C", 자동으로 찾아서 문자열 반환
		System.out.println(comp.group(1)); // "A@C", 1번 그룹에 일치하므로 문자열 반환
		System.out.println(comp.group(2)); // null, 2번 그룹에 불일치하므로 null 반환
	}
}

 

 


 

[ Matcher 타입 인스턴스.start() ]

  • group() 메소드와 같이 find() 메소드 실행 후 찾은 문자열의 인덱스 위치를 반환 

argument로 그룹넘버를 지정해줄 경우 현재 보관하고 있는 문자열이 해당 그룹에 일치하면 인덱스를 반환하고, 그렇지 않으면 -1을 리턴합니다.

 

package study.first;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "([ABC][@][ABC])|([XYZ][#][XYZ])";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C매칭되지않는문자열X#Y";
		Matcher comp = regex.matcher(c);

		System.out.println(comp.find());   // true
		System.out.println(comp.group());  // "A@C"
		System.out.println(comp.start());  // 0
		System.out.println(comp.start(1)); // 0
		System.out.println(comp.start(2)); // -1		
	}
}

 


[ Matcher 타입 인스턴스.end() ]

  • 찾은 문자열의 끝 다음 인덱스 위치를 반환
  • start() 메소드와 유사함

"ABCD"에서 찾은 문자열이 "ABC"라면 해당 메소드의 반환값은 3입니다. 위의 메소드들과 유사하게 작동합니다.

package study.first;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "([ABC][@][ABC])|([XYZ][#][XYZ])";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C매칭되지않는문자열X#Y";
		Matcher comp = regex.matcher(c);

		System.out.println(comp.find());   // true
		System.out.println(comp.group());  // "A@C", 자동으로 찾아서 문자열 반환
		System.out.println(comp.end());    // 3
		System.out.println(comp.end(1));   // 3
		System.out.println(comp.end(2));   // -1		
	}
}

 


 

[ Matcher 타입 인스턴스.groupCount() ]

  • 괄호로 지정해서 그룹핑한 정규표현식 패턴(규칙)의 전체 개수 반환
package study.first;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

	public static void main(String[] args) {

		// 정규표현식 작성
		String a = "([ABC][@][ABC])|([XYZ][#][XYZ])";
		Pattern regex = Pattern.compile(a);

		// 비교 문자열 생성
		String c = "A@C매칭되지않는문자열X#Y";
		Matcher comp = regex.matcher(c);

		System.out.println(comp.groupCount());  // 2
		
	}
}

 

728x90

댓글

💲 추천 글