Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바(Java)에서 하나의 입력값에 대해 여러 정규식 패턴을 검증하는 방법


"|" 메타 문자 활용: 자바 정규 표현식에서 메타 문자 "|"는 여러 개의 정규식을 하나로 묶어 매칭할 수 있게 해줍니다. 하나의 입력 텍스트를 두 개 이상의 표현식과 비교해야 할 때, 각 표현식을 "|"로 구분하여 작성하면 됩니다.

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 객체 방식은 각 패턴의 매칭 결과를 개별적으로 확인할 수 있고, 패턴별로 다른 후속 작업을 수행해야 하거나 관리해야 할 정규식이 많은 경우에 더 유연하고 확장성 있는 구조를 제공합니다. 상황에 맞게 두 방식을 선택하여 사용하시기 바랍니다.