[알고리즘] 정규표현식

정규표현식 🧶

정규표현식(Regular Expression)이란?

특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어


정규표현식의 기본패턴

표현식 의미
^ 문자열의 시작
$ 문자열의 종료
. 줄바꿈을 제외한 임의의 한 문자
[..] [] 사이에 있는 임의의 한 문자 또는 문자 집합
[^..] [] 사이에 있는 임의의 한 문자 또는 문자 집합을 제외
\d 0~9 사이의 숫자, [0-9]와 동일
\D 숫자가 아닌 문자, [ ^0-9]와 동일
{X} X회 이상 반복
{X, Y} X~Y 사이의 수 만틈 반복
*? 가장 적게 일치하는 패턴을 찾음


자주 사용되는 정규표현식

정규표현식 의미
^[0-9]*$ 숫자
^[a-zA-Z]*$ 영문자
^[가-힣]*$ 한글
\w+@\w+\.\w+(\.\w+)? E-Mail
^\d{2,3}-\d{3,4}-\d{4}$ 전화번호
^01(?:0|1|[6-9])-(?:\d{3}|\d{4})-\d{4}$ 휴대전화번호
\d{6} - [1-4]\d{6} 주민등록번호
^\d{3}-\d{2}$ 우편번호


정규표현식 사용법

🧶 옛날 과제에서 사용했던 예시를 가져와 봤다.

import java.util.regex.Pattern;

public class example {
	public static void main(String[] args)  {
        String chkPhone ="^01(?:0|1|[6-9])[-](?:\\d{3}|\\d{4})[-]\\d{4}$";
        String value = "010-0000-0000";
        
        boolean check = Pattern.matches(chkPhone, value);
        System.out.println(check);
    }
}


주요 메소드

String.matches(regex): String이 regex와 일치하면 true

String.split(regex): regex와 일치하는 것을 기준으로 String을 분리해 배열로 반환

String.replaceFirst(regex, replace): regex와 가장 먼저 일치하는 것을 replace로 변환

String.replaceAll(regex, replace): regex와 일치하는 모든 것을 replace로 변환


추천 문제

프로그래머스 신규 아이디 추천

이 문제는 내가 지난번에 풀어봤던 문제인데 (코드), 정규표현식을 사용하면 훨씬 간단하게 나타낼 수 있다.

  1. 2단계: 소문자, 숫자, -, _, . 만 문자열에 넣음

    정규표현식 사용 전

    for (int i = 0; i < new_id.length(); i++) {
        char c = new_id.charAt(i);
        if (Character.isLowerCase(c) || Character.isDigit(c) ||
               c == '-' || c == '_' || c == '.') {
            tmp += Character.toString(c);
        }
    }
    

    정규표현식 사용 후

    new_id = new_id.replaceAll("[^-_.a-z0-9]", "");
    
  2. 3단계: .이 연속되면 .을 하나로

    정규표현식 사용 전 (참고로 모든 테스트 케이스가 통과되지 않는 코드다.)

        
            String check = "";
            int idx = 0;
            for (int i = 0; i < new_id.length()-1; i++) {
                if (new_id.charAt(i) == '.' && new_id.charAt(i+1) == '.') {
                    idx = i;
                    while (new_id.charAt(idx) == '.') {
                        check += ".";
                        idx++;
                        if (idx == new_id.length()) {
                            break;
                        }
                    }
                    tmp = tmp.replace(check, ".");
                    check = "";
                    i = idx-1;
                }
            }
    

    정규표현식 사용 후

    new_id = new_id.replaceAll("[.]{2,}", ".");
    
  3. 4단계: 처음이나 끝의 . 제거

    정규표현식 사용 전

            if (new_id.startsWith(".")) {
                new_id = new_id.substring(1, new_id.length());
            }
       
            if (new_id.endsWith(".")) {
                new_id = new_id.substring(0, new_id.length()-1);
            }
       
    

    정규표현식 사용 후

    new_id = new_id.replaceAll("^[.]|[.]$", "");