정규 표현식(Regular Expression)은 입력 텍스트에서 원하는 패턴을 검색하거나 치환하기 위해 문자들의 조합으로 정의한 문자열입니다. 하나 이상의 문자로 구성될 수 있으며, 이를 활용하면 문자열을 손쉽게 검색하거나 원하는 형태로 교체할 수 있습니다.
Java는 java.util.regex 패키지를 통해 정규 표현식 기반의 패턴 매칭 기능을 제공합니다. 이 패키지에는 세 가지 주요 클래스가 포함되어 있습니다.
1. Pattern 클래스
Pattern 클래스는 정규 표현식을 컴파일한 결과를 나타내는 클래스입니다. 문자열과 정규 표현식을 매칭하기 위해 다음 두 가지 핵심 메서드를 제공합니다.
- compile(): 정규 표현식을 담은 문자열을 인자로 받아, 해당 정규 표현식이 반영된 Pattern 객체를 반환합니다.
- matcher(): 검색 대상이 되는 문자열 값을 인자로 받아, 현재 Pattern 객체가 나타내는 패턴과 주어진 문자열을 비교하는 Matcher 객체를 생성합니다.
2. Matcher 클래스
Matcher 클래스는 실제 매칭 작업을 수행하는 엔진 역할을 합니다. 매칭된 결과를 확인하기 위해 다음 메서드들을 사용합니다.
- find(): 현재 객체가 수행하는 매칭 작업이 성공하면 true를, 실패하면 false를 반환합니다.
- group(): 특정 그룹을 나타내는 정수값을 인자로 받아, 매칭 작업에서 해당 그룹이 캡처한 문자열 시퀀스를 반환합니다.
3. PatternSyntaxException
PatternSyntaxException은 정규 표현식 패턴에 문법 오류가 존재함을 알리는 언체크(unchecked) 예외입니다. 잘못된 패턴을 compile()에 전달하면 이 예외가 발생할 수 있습니다.
예제 1: ASCII가 아닌 문자 제거하기
다음 예제는 정규 표현식을 사용해 입력 문자열에서 ASCII 범위에 속하지 않는 문자를 모두 제거하는 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main( String args[] ) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input string: ");
String input = sc.nextLine();
String regex = "[^\\p{ASCII}]";
// 패턴 객체 생성
Pattern pattern = Pattern.compile(regex);
// 컴파일된 패턴을 문자열과 매칭
Matcher matcher = pattern.matcher(input);
// 빈 StringBuffer 생성
StringBuffer sb = new StringBuffer();
while (matcher.find()) {
matcher.appendReplacement(sb, "");
}
matcher.appendTail(sb);
System.out.println("Result: \n"+ sb.toString() );
}
}출력 결과
Enter input string: whÿ do we fall Result: wh do we fall
위 예제에서는 [^\p{ASCII}]라는 정규 표현식으로 ASCII 범위 밖의 모든 문자를 찾아냈습니다. 실행 결과를 보면 'ÿ'처럼 ASCII에 포함되지 않는 문자가 제거된 것을 확인할 수 있습니다.
예제 2: 특정 문자의 위치 찾기
다음 예제는 입력 텍스트에서 문자 't'가 나타나는 인덱스 위치를 순차적으로 출력하는 프로그램입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class StartExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter input text: ");
String input = sc.nextLine();
String regex = "[t]";
// 패턴 객체 생성
Pattern pattern = Pattern.compile(regex);
// 컴파일된 패턴을 문자열과 매칭
Matcher matcher = pattern.matcher(input);
int count = 0;
while (matcher.find()) {
int start = matcher.start();
System.out.println(start);
}
}
}출력 결과
Enter input text: Hello how are you welcome to Tutorialspoint 26 31 42
두 번째 예제에서는 [t]라는 정규 표현식으로 문자 't'의 등장 위치를 찾습니다. find() 메서드가 매칭에 성공할 때마다 start() 메서드를 통해 해당 위치(인덱스)를 얻어 출력하며, 대소문자를 구분하므로 'T'는 결과에 포함되지 않는 점도 참고하세요.