정규식에서 서브 표현식이자 메타문자인 're?'는 바로 앞에 위치한 표현식이 0번 또는 1번 나타나는 경우와 일치시킵니다. 즉, 물음표(?) 앞의 문자가 있어도 되고 없어도 되는 선택적(optional) 요소로 취급됩니다.
예제 1: 'Wel?' 패턴으로 매칭 횟수 세기
아래 예제는 'Wel?' 패턴을 사용하여 문자열에서 일치하는 항목의 개수를 세는 프로그램입니다. 여기서 'l?'은 문자 'l'이 있거나 없는 경우 모두 매칭되므로, 'We' 뒤에 'l'이 하나만 있어도 일치로 처리됩니다.
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main( String args[] ) {
String regex = "Wel?";
String input = "Welcome to Tutorialspoint";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int count = 0;
while(m.find()) {
count++;
}
System.out.println("Number of matches: "+count);
}
}실행 결과
Number of matches: 1
예제 2: 알파벳과 선택적 숫자 검증하기
다음 Java 프로그램은 사용자로부터 문자열을 입력받아, 해당 문자열이 알파벳(대소문자 모두)으로 시작하고 그 뒤에 숫자가 0개 또는 1개 있는지 확인합니다. 정규식 '[a-zA-Z][0-9]?'를 활용한 대표적인 패턴 검증 예제입니다.
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Test {
public static void main( String args[] ) {
String regex = "[a-zA-Z][0-9]?";
Scanner sc = new Scanner(System.in);
System.out.println("Enter an input string: ");
String input = sc.nextLine();
//Pattern 객체 생성
Pattern p = Pattern.compile(regex);
//Matcher 객체 생성
Matcher m = p.matcher(input);
if(m.find()) {
System.out.println("Match occurred");
} else {
System.out.println("Match not occurred");
}
}
}출력 결과 1: 알파벳으로 시작하는 경우
Enter an input string: sample text Match occurred
출력 결과 2: 알파벳과 숫자가 함께 있는 경우
Enter an input string: sample text 34 56 Match occurred
출력 결과 3: 숫자로만 시작하는 경우
Enter an input string: 32 89 45 63 Match not occurred
정리
're?' 메타문자는 특정 문자나 표현식을 선택 사항으로 만들고 싶을 때 유용하게 사용됩니다. 위 예제에서 볼 수 있듯이, 물음표(?) 앞의 요소가 존재하지 않아도 매칭에 성공하며, 입력값 검증이나 유연한 패턴 매칭이 필요한 상황에서 널리 활용됩니다.