정규표현식 (Regular Expression)

정규표현식

  • 특정 조건에 맞는 문자열을 검색/치환하는 패턴 기반의 식
  • 이메일, 전화번호 등 특정한 형식에 맞는지 validation하는 데에 사용

정규표현식 표현 방법

  • 정규 표현식의 기본 작성 방식

    1
    "/패턴/[플래그(Opt.)]"
  • 기본 메타 문자

    메타 문자 의미
    ^x x로 시작
    x$ x로 끝
    .x x앞에 하나의 문자가 있음
    x+ x가 1번 이상 반복
    x? x가 있거나 없음
    x* x가 0번 이상 반복
    `x y`
  • 괄호의 활용

    regexp 의미
    (xy) 괄호 안의 내용을 그룹화
    x{n} n번 반복됨
    x{n,} n번 이상 반복됨
    x{n, m} n번 이상, m번 이하 반복됨
    [xy] x 또는 y
    [a-z] 알파벳 소문자 (a~z)
    [0-9] 숫자
    [가-힣] 한글
    [^x] x가 아닌 것
    [^0-9] 숫자가 아닌 것
  • \ 축약 문자

    regexp 의미
    \^, \., … \ 뒤에 나오는 문자를 문자로 처리
    \b 단어의 경계를 찾는다.
    \B 단어의 경계가 아닌 것을 찾는다.
    \d 숫자를 찾는다.
    \D 숫자가 아닌 것을 찾는다.
    \s 공백 문자를 찾는다.
    \S 공백 문자가 아닌 것을 찾는다.
    \w [a-zA-Z0-9_]
    \W [^a-zA-Z0-9_]

    JAVA에서는 \\\ 처럼 입력해야 \\처럼 동작한다

  • 유용한 정규식 예

    • 한글 이름 : ^[가-힣]{2,5}$
    • 핸드폰 번호: ^01(0|1|2|6|9)[-\s]?\d{3,4}[-\s]?\d{4}$
    • 이메일 주소: ^[\w\.-]{1,64}@[\w\.-]{1,252}\.\w{2,4}$

Flag

Flag 기능
g 문자열 내 모든 패턴을 찾음
i 대소문자를 구분하지 않음
m 문자열의 모든 줄에서 찾음

정규표현식을 사용하는 클래스

Pattern 클래스

  • 정규식의 컴파일된 표현 입니다(정규식을 적용 가능하도록 컴파일해서 가지고 있습니다).

  • Pattern 클래스는 공개된 생성자를 제공하지 않습니다.

  • 패턴을 생성하려면 Pattern객체를 반환하는 정적 compile 메소드를 호출해야 합니다.

  • 이 메소드는 첫 번째 인자로 정규식 문자열을 받아 들입니다.

    메소드 설명
    public static Pattern compile(String regex) Pattern 객체를 생성
    public Matcher matcher(CharSequence input) 입력을 분석하는 Matcher 객체 생성
    public static boolean matches(String regex, CharSequence input) 입력이 regexp에 해당하는지 판단

Matcher 클래스

  • 패턴을 해석하고 입력 문자열에 대해 일치 작업을 수행하는 엔진입니다.

  • Pattern 클래스와 마찬가지로 Matcher는 어떤 공개된 생성자도 정의하고 있지 않습니다.

  • Matcher객체는 Pattern 객체의 matcher 메소드를 호출해서 얻습니다.

    메소드 설명
    find() 정규표현식에 부합되는 내용이 문자열에 포함되어 있는지 반환. 이전 검색 위치부터 이어서 검색.
    start() 패턴에 부합되는 요소의 시작 인덱스 반환
    end() 패턴에 부합되는 요소가 끝나는 위치 + 1을 반환
    matches() 문자열 전체가 정규표현식에 일치하는지 반환
    lookingAt() 비교하려는 문자열이 정규표현식으로 시작하는지 반환. 0번 인덱스부터 검색.
    replaceFirst() 일치하는 첫 패턴을 문자열로 대체
    replaceAll() 일치하는 모든 패턴을 문자열로 대체
    reset() Matcher의 정보를 리셋하여 0번 인덱스부터 다시 검색

정규식 캡쳐 그룹

  • 정규표현식에서 캡쳐링 그룹은 괄호로 둘러싼 영역이다.

  • 사용 예

    • 순서로 그룹 가져오기

      1
      2
      3
      4
      5
      6
      7
      8
      9
      Pattern pattern2 = Pattern.compile("^\\w+):(\\w+)\\.(\\w+)$");
      Matcher matcher2 = pattern2.matcher("filename:temp.png");

      matcher2.find();
      System.out.println(matcher2.group()); // 매칭된 전체가 출력
      System.out.println(matcher2.group(0)); // 매칭된 전체가 출력
      System.out.println(matcher2.group(1)); // 첫번째 그룹
      System.out.println(matcher2.group(2));
      System.out.println(matcher2.group(3));
    • Name으로 그룹 가져오기

      1
      2
      3
      4
      5
      6
      7
      8
       Pattern pattern2 = Pattern.compile("^(?<field>\\w+):(?<name>\\w+)\\.(?<ext>\\w+)$");
      Matcher matcher2 = pattern2.matcher("filename:temp.png");

      matcher2.find();

      System.out.println(matcher2.group("field")); // name group
      System.out.println(matcher2.group("name"));
      System.out.println(matcher2.group("ext"));