정규표현식

정규 표현식에서 사용되는 기호를 Meta문자라고 표현한다. 표현식에서 내부적으로 특정 의미를 가지는 문자를 말하며 간단하게 정리하면 아래의 표와 같다.

정규표현식 내용
^x 문자열의 시작을 표현하며, x문자로 시작됨
x$ 문자열의 종료를 표현하며, x문자로 종료됨
.x 임의의 한 문자의 자리수를 표현하며 문자열이 x로 끝남
x+ 반복을 표현, x문자가 한번 이상 반복됨을 의미
x? 존재여부를 표현, x문자가 존재할 수도, 존재하지 않을 수도 있음
x* 반복여부를 표현, x문자가 0번 또는 그 이상 반복됨
x|y or 을 표현하며, x또는 y문자가 존재함을 의미
(x) 그룹을 표현하며 x를 그룹으로 처리함
(x)(y) 그룹들의 집합을 표현하며, 앞에서부터 순서대로 번호를 부여하여 관리하고 x, y는 각 그룹의 데이터로 관리
(x)(?:y) 그룹들의 집합에 대한 예외를 표현, 그룹 집합으로 관리되지 않음을 의미
x{n} 반복을 표현, x문자가 n번 반복됨을 의미
x{n,} 반복을 표현, x문자가 n번 이상 반복됨을 의미
x{n,m} 반복을 표현, x문자가 최소 n번 이상 최대 n번 이하로 반복됨을 의미

특수한 정규표현식

Meta 문자들 중에서 좀 더 특수하게 사용되는 문자들이 존재한다. ‘[]’ 는 내부에 지정된 문자열의 범위 중에서 한 문자만을 선택하다는 특수한 의미를 가진다. 그리고 내부에서 Meta문자를 사용하면 다른 의미를 가지고 동작할 수 있으므로 잘 확인하고 사용해야 한다. 좀 더 특별한 용도로 사용되는 것들은 아래의 표와 같다.

정규표현식 내용
[xy] 문자 선택을 표현하며 x와 y중에 하나를 의미
[^xy] not을 표현하며 x및 y를 제외한 문자를 의미
[x-z] range를 표현하며 x ~ z 사이의 문자를 의미
\^ escape를 표현하며 ^를 문자로 사용함을 의미
\b word boundary를 표현하며 문자와 공백사이의 문자를 의미
\B non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미
\d digit를 표현하며 숫자를 의미
\D non digit를 표현하며 숫자가 아닌 것을 의미
\s space를 표현하며 공백 문자를 의미
\S non space를 표현하며 공백 문자가 아닌 것을 의미
\t tab을 표현하며 탭 문자를 의미
\v vertical tab을 표혐하며 수직 탭 문자를 의미
\w word를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미
\W non word를 표현하며 알파벳 + 숫자 + _가 아닌 문자를 의미

Flag


정규표현식을 사용할 때 Flag 라는 것이 존재하는데 Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다. Flag는 다음과 같은 것들이 존재한다.

정규표현식 내용
g Global을 표현하며, 대상 문자열 내에 모든 패턴들을 검색하는 것을 의미한다.
i ignore case를 표현하며, 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
m Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다.

예제


import java.util.regex.Pattern;
 
/** 문자열의 형식을 검사하는 기능을 갖는 클래스 */
public class PatternChecker {
     
    /** 숫자 모양에 대한 형식 검사 */
    public static boolean isNum(String str) {
        return Pattern.matches("^[0-9]*$", str);
    }
     
    /** 영문으로만 구성되었는지에 대한 형식 검사 */
    public static boolean isEng(String str) {
        return Pattern.matches("^[a-zA-Z]*$", str);
    }
     
    /** 한글로만 구성되었는지에 대한 형식 검사 */
    public static boolean isKor(String str) {
        return Pattern.matches("^[ㄱ-ㅎ가-힣]*$", str);
    }
     
    /** 영문과 숫자로만 구성되었는지에 대한 형식 검사 */
    public static boolean isEngNum(String str) {
        return Pattern.matches("^[a-zA-Z0-9]*$", str);
    }
     
    /** 한글과 숫자로만 구성되었는지에 대한 형식 검사 */
    public static boolean isKorNum(String str) {
        return Pattern.matches("^[ㄱ-ㅎ가-힣0-9]*$", str);
    }
     
    /** 이메일 형식인지에 대한 검사 --> "아이디@도메인"의 형식을 충족해야 한다. */
    public static boolean isEmail(String str) {
        return Pattern.matches("[0-9a-zA-Z]+(.[_a-z0-9-]+)*@(?:\\w+\\.)+\\w+$", str);
    }
     
    /** 핸드폰번호인지에 대한 형식검사.
        반드시 앞자리가 010,010,016~9사이를 충족해야 하며,
        각 부분에 대한 자리수도 충족시켜야 한다.
        "-"는 허용하지 않는다. */
    public static boolean isCellPhone(String str) {
        return Pattern.matches("^01(?:0|1|[6-9])(?:\\d{3}|\\d{4})\\d{4}$", str);
    }
     
    /** 전화번호인지에 대한 형식검사. 각 연결부는 "-"로 구분되어야 한다.
        각 부분에 대한 자리수도 충족시켜야 한다.
        "-"는 허용하지 않는다. */
    public static boolean isTel(String str) {
        return Pattern.matches("^\\d{2,3}-\\d{3,4}-\\d{4}$", str);
    }
     
    /** 주민번호에 대한 글자수 및 뒷자리 첫글자가 1~4의 범위에 있는지에 대한 검사.
        "-"는 허용하지 않는다. */
    public static boolean isJumin(String str) {
        return Pattern.matches("^\\d{6}[1-4]\\d{6}", str);
    }
     
    /** 아이피주소 형식에 대한 검사 */
    public static boolean isIP(String str) {
        return Pattern.matches("([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})\\.([0-9]{1,3})", str);
    }

}

참고


정규표현식 (Regex) 정리

[정규표현식] 정규표현식 정리