"|" 메타 문자 활용: 자바 정규 표현식에서 메타 문자 "|"는 여러 개의 정규식을 하나로 묶어 매칭할 수 있게 해줍니다. 하나의 입력 텍스트를 두 개 이상의 표현식과 비교해야 할 때, 각 표현식을 "|"로 구분하여 작성하면 됩니다.
exp1|exp2|exp3
예제
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SampleExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("입력하세요: ");
String input = sc.nextLine();
// 정규 표현식
String regex = "\\d{10}|^[aeiou]";
// Pattern 객체 생성
Pattern pattern = Pattern.compile(regex);
// Matcher 객체 생성
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
System.out.println(input + " 은(는) 유효합니다");
} else {
System.out.println(input + " 은(는) 유효하지 않습니다");
}
}
}
실행 결과 1
입력하세요: 9848033228 9848033228 은(는) 유효합니다
실행 결과 2
입력하세요: an apple a day keeps doctor away an apple a day keeps doctor away 은(는) 유효합니다
위 예제의 정규식 \\d{10}|^[aeiou]는 "10자리 숫자" 또는 "모음(a, e, i, o, u)으로 시작하는 문자열" 중 하나라도 일치하면 유효한 것으로 판단합니다.
List 객체를 활용하는 방법
또 다른 방법은 각 정규 표현식을 개별 Pattern 객체로 컴파일한 뒤, 이들을 리스트(List)에 담아 입력 텍스트에 대해 순차적으로 매칭을 수행하는 것입니다. 이 방식은 어떤 패턴이 일치했는지 개별적으로 확인하고, 패턴마다 서로 다른 처리 로직을 적용할 수 있다는 장점이 있습니다.
List list = new ArrayList<>();
list.add(Pattern.compile(regex1));
list.add(Pattern.compile(regex2));
for (Pattern pattern : list) {
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
. . . . . . . . . . . . . . .
} else {
. . . . . . . . . . . . . . .
}
}
예제
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MultipleRegex {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("입력하세요: ");
String input = sc.nextLine();
// 정규 표현식
String regex1 = "\\d{10}";
String regex2 = "^[aeiou]";
// Pattern 객체 생성
Pattern pattern1 = Pattern.compile(regex1);
Pattern pattern2 = Pattern.compile(regex2);
// List 객체 생성
List<Pattern> patterns = new ArrayList<>();
patterns.add(pattern1);
patterns.add(pattern2);
for (Pattern pattern : patterns) {
Matcher matcher = pattern.matcher(input);
if(matcher.find()) {
System.out.println("정규식 " + pattern.pattern() + " 기준, " + input + " 은(는) 유효합니다");
} else {
System.out.println("정규식 " + pattern.pattern() + " 기준, " + input + " 은(는) 유효하지 않습니다");
}
}
}
}
실행 결과 1
입력하세요:
9848033228
정규식 \d{10} 기준, 9848033228 은(는) 유효합니다
정규식 ^[aeiou] 기준, 9848033228 은(는) 유효하지 않습니다
실행 결과 2
입력하세요:
an apple a day keeps doctor away
정규식 \d{10} 기준, an apple a day keeps doctor away 은(는) 유효하지 않습니다
정규식 ^[aeiou] 기준, an apple a day keeps doctor away 은(는) 유효합니다
두 방식의 비교 및 정리
"|" 메타 문자 방식은 코드가 간결하고 단 한 번의 find() 호출로 여러 패턴을 검사할 수 있어, 단순히 "하나라도 일치하는지"만 확인하면 될 때 적합합니다. 반면 List 객체 방식은 각 패턴의 매칭 결과를 개별적으로 확인할 수 있고, 패턴별로 다른 후속 작업을 수행해야 하거나 관리해야 할 정규식이 많은 경우에 더 유연하고 확장성 있는 구조를 제공합니다. 상황에 맞게 두 방식을 선택하여 사용하시기 바랍니다.