정규표현식
정규 표현식에서 사용되는 기호를 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);
}
}