Develop
[Java] 정규식 / 정규표현식 (RegExp) - 입력값 체크 본문
정규식 / 정규표현식 (Regular Expression)
: 특정한 규칙을 가지는 문자열의 집합을 표현하는데 사용하는 형식 언어
특정한 규칙(형식)
: 전화번호, 주민등록번호, 이메일 등 정해진 형식이 있는 문자열들
즉 형식에 맞게 제대로 입력했는지 확인(검증)하기 위해 정규식을 사용한다.
사용하기 위해서는 java.util.regex 를 import 하기
정규식 /정규표현식 패턴
1. 문자 클래스(Character classes)
: 문자와 숫자를 구분하는 것과 같이 문자 종류를 구분하는데 사용한다.
종류 | 뜻 | 허용하는 범위 | 예제 |
\\w |
문자만 허용하는 정규표현식 | (a-z, A-Z, 0-9, …) | String REGEXP_PATTERN_CHAR = "^[\\w]*$"; |
\\W | 문자가 아닌 경우에만 허용하는 정규표현식 | ! (a-z, A-Z, 0-9, …) | String REGEXP_PATTERN_NO_CHAR = "^[\\W]*$"; |
\\d | 숫자만 허용하는 정규표현식 | (0-9) | String REGEXP_PATTERN_NUMBER = "^[\\d]*$"; |
\\D | 숫자가 아닌 경우에만 허용하는 정규표현식 | ! (0-9) | String REGEXP_PATTERN_NO_NUMBER = "^[\\D]*$"; |
\\s | 공백 문자( 공백 문자 : [\t\n\x0B\f\r] ), 탭만을 허용만 정규 표현식 | (space, tabe, newline) | String REGEXP_PATTERN_SPACE_CHAR = "^[\\s]*$"; |
\\S | 공백 문자, 탭이 아닌 경우에만 허용하는 정규표현식 | ! (space, tabe, newline) | String REGEXP_PATTERN_SPACE_NO_CHAR = "^[\\S]*$"; |
\A | 입력의 시작 부분 | ||
\b | 단어의 경계 | ||
\B | 단어가 아닌것에 대한 경계 | ||
\G | 이전 매치의 끝 | ||
(?!) | 앞 부분에 (?!) 라는 옵션을 넣어주게 되면 대소문자를 구분하지 않는다. |
Character classes - JavaScript | MDN (mozilla.org)
Character classes - JavaScript | MDN
Character classes distinguish kinds of characters such as, for example, distinguishing between letters and digits.
developer.mozilla.org
2. 어설션( Assertions)
: 행이나 단어의 시작과 끝을 나타내는 경계와 (앞, 뒤를 읽고 조건식을 포함한다) 어떤 식으로든 매치가 가능한 것을 나타내는 다른 패턴이 포함된다.
종류 | 뜻 | 예제 |
^ | 문장의 시작 (특정 문자열로 시작) | ^www (문자열이 www로 시작함을 의미) |
$ | 문장의 끝 (특정 문자열로 끝남) | com$ (문자열이 com으로 끝남을 의미) |
. | 임의의 한 문자의 자리수를 표현 | .A (문자열이 A로 끝남을 의미) |
Assertions - JavaScript | MDN (mozilla.org)
Assertions - JavaScript | MDN
Assertions include boundaries, which indicate the beginnings and endings of lines and words, and other patterns indicating in some way that a match is possible (including look-ahead, look-behind, and conditional expressions).
developer.mozilla.org
3. 수량자(Quantifiers)
: 일치시킬 문자 또는 표현식의 수를 의미한다.
종류 | 뜻 | 예제 |
? | 존재여부 : 존재할 수도 있고 존재하지 않을수도 있다 | A? |
* | 반복여부 : 0번 또는 그 이상 반복 | A* |
+ | 반복 : 한번 이상 반복 | A+ (A가 한번 이상 반복됨) |
| | or 뜻과 같음 (또는) | A|B (A 또는 B가 존재) |
{n} | 반복 : n번 반복 | A{n} (A가 n번 반복됨) |
{n,} | 반복 : 최소 n번 이상 반복 | A{n,} (A가 n번이상 반복됨) |
{n, m} | 반복 : 최소 n번 이상, 최대 m번 이하로 반복 | A{n,m} (A가 n번이상, m번 이하로 반복됨) |
Quantifiers - JavaScript | MDN (mozilla.org)
Quantifiers - JavaScript | MDN
Quantifiers indicate numbers of characters or expressions to match.
developer.mozilla.org
4. 그룹과 범위(Group and Range)
: 정규식 문법을 그룹화하거나 범위를 지정할 때 사용하는 패턴이다.
종류 | 뜻 | 예제 |
() | 그룹 | (A) (A를 그룹으로 처리함) |
()() | 그룹들의 집합 : 앞에서부터 순서대로 번호를 부여하여 관리함 | (A)(B) (A,B는 각 그룹의 데이터로 관리됨) |
?: | 그룹들의 집합에 대한 예외 (찾지만 기억하지는 않음) | (X)(?:Y) (Y는 그룹 집합으로 관리되지 않음) |
[] | 문자셋 (괄호안의 어떤 문자든) | [ABC] (A,B,C 중 하나이면 일치) |
[^] | 부정 문자셋 (괄호안의 어떤 문자가 아닐 때) | [^ABC] (A,B,C 를 제외한 글자이면 일치) |
[a-zA-z] | a부터 z까지의 소문자 알파벳이거나 A부터 Z까지의 대문자 알파벳 중의 하나라면 일치(범위) | |
[a-d[m-p]] | a 부터 d까지, 또는 m 부터 p까지 중에 하나와 일치 : [a-dm-p] (합집합) | |
[a-z&&[def]] | d, e, f 중의 하나와 일치 (교집합) | |
[a-z&&[^bc]] | b와 c를 제외한 a 부터 z까지 중의 하나와 일치 : [ad-z] (차집합) | |
[a-z&&[^m-p]] | m부터 p까지를 제외한, a부터 z까지 중의 하나와 일치 : [a-lq-z] (차집합) |
Groups and backreferences - JavaScript | MDN (mozilla.org)
Groups and backreferences - JavaScript | MDN
Groups group multiple patterns as a whole, and capturing groups provide extra submatch information when using a regular expression pattern to match against a string. Backreferences refer to a previously captured group in the same regular expression.
developer.mozilla.org
자주 사용하는 정규식
회원 가입 또는 사용자 정보에 대한 정규식
정규식 | 용도 |
^[0-9]*$ | 숫자 |
^[a-zA-Z]*$ | 영문 |
^[가-힣]*$ | 한글 |
\\w+@\\w+\\.\\w+(\\.\\w+)? | |
^\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}$ | 우편번호 |
정규식 | 용도 |
"^[a-zA-Z0-9]+@[0-9a-zA-Z]+\\.[a-z]+$" | 이메일 |
"^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,3}+$" | 이메일 - 언더바(_), 하이픈(-) 포함 및 길이 지정 |
"^[a-z]{1}[a-z0-9]{5,10}+$" | 아이디 - 영문 숫자 조합 6~10자리 |
"^(?=.*[a-zA-Z])((?=.*\\d)|(?=.*\\W)).{10,128}+$"; | 패스워드 - 대소문자 + 숫자 + 특수문자 조합으로 10 ~ 128자리로 정의 한다. |
"^[\\d]{11}+$"; | 핸드폰 번호 타입1 => ex) 01012345678 |
"^01([0|1|6|7|8|9])-([0-9]{3,4})-([0-9]{4})+$" | 핸드폰 번호 타입2-1 => ex) 010-1234-5678 |
"^[\\d]{2,3}-[\\d]{3,4}-[\\d]{4}+$" | 핸드폰 번호 타입2-2 => ex) 010-1234-5678 |
"^\\+82-01([0|1|6|7|8|9])-([\\d]{3,4})-([\\d]{4})+$" | 핸드폰 번호 타입3 => ex) +82-010-1234-5678 |
"^\\+82-10-([\\d]{3,4})-([\\d]{4})+$" | 핸드폰 번호 타입4 => ex) +82-10-1234-5678 |
"^[\\d]{6}-[1-4][\\d]{6}+$" | 주민등록번호 |
"^[\\d]{3}-[\\d]{2}+$" | 우편번호 |
사용 예시
/**
* [정규식 모음-4] 사용자 정보 관련 정규식
*/
// 1. 사용자 이메일에 대한 정규식
public static final String REGEXP_LIGHT_USER_EMAIL = "^[a-zA-Z0-9]+@[0-9a-zA-Z]+\\.[a-z]+$"; // 언더바(_), 하이픈(-) 제외
public static final String REGEXP_TIGHT_USER_EMAIL = "^[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\\.]?[0-9a-zA-Z])*\\.[a-zA-Z]{2,3}+$"; // 언더바(_), 하이픈(-) 포함 및 길이 지정
// 2. 사용자 아이디에 대한 정규식 - 영문 숫자 조합 6~10자리
public static final String REGEXP_USER_ID = "^[a-z]{1}[a-z0-9]{5,10}+$";
// 3. 사용자 패스워드에 대한 정규식 - 대소문자 + 숫자 + 특수문자 조합으로 10 ~ 128자리로 정의 한다.
public static final String REGEXP_USER_PW_TYPE1 = "^(?=.*[a-zA-Z])((?=.*\\d)|(?=.*\\W)).{10,128}+$";
// 4. 핸드폰 번호 타입1에 대한 정규식 => ex) 01012345678
public static final String REGEXP_PHONE_TYPE1 = "^[\\d]{11}+$";
// 5. 핸드폰 번호 타입2에 대한 정규식 => ex) 010-1234-5678
public static final String REGEXP_PHONE_TYPE2_1 = "^01([0|1|6|7|8|9])-([0-9]{3,4})-([0-9]{4})+$";
public static final String REGEXP_PHONE_TYPE2_2 = "^[\\d]{2,3}-[\\d]{3,4}-[\\d]{4}+$";
// 6. 핸드폰 번호 타입3에 대한 정규식 => ex) +82-010-1234-5678
public static final String REGEXP_PHONE_TYPE3 = "^\\+82-01([0|1|6|7|8|9])-([\\d]{3,4})-([\\d]{4})+$";
// 7. 핸드폰 번호 타입4에 대한 정규식 => ex) +82-10-1234-5678
public static final String REGEXP_PHONE_TYPE4 = "^\\+82-10-([\\d]{3,4})-([\\d]{4})+$";
// 8. 주민등록번호 타입에 대한 정규식
public static final String REGEXP_REGISTRATION_NUM = "^[\\d]{6}-[1-4][\\d]{6}+$";
// 9. 우편 번호에 대한 정규식
public static final String REGEXP_POSTAL_CODE = "^[\\d]{3}-[\\d]{2}+$";
/*
* 사용자 이메일 형태 유효성 검증-1 : 아이디 내에 언더바(_), 하이픈(-) 제외
* "^[a-zA-Z0-9]+@[0-9a-zA-Z]+\.[a-z]+$" 정규식 패턴 사용
*/
Boolean isValidType1UserEmail1 = Pattern.matches(REGEXP_LIGHT_USER_EMAIL, "adjh54@naver.com"); // true
Boolean isValidType1UserEmail2 = Pattern.matches(REGEXP_LIGHT_USER_EMAIL, "adjh_54@naver.com"); // false
Boolean isValidType1UserEmail3 = Pattern.matches(REGEXP_LIGHT_USER_EMAIL, "adjh&&@naver.com"); // false
/*
* 사용자 이메일 형태 유효성 검증-2 : 아이디 내에 언더바(_), 하이픈(-) 포함
* "^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}+$" 정규식 패턴 사용
*/
Boolean isValidType2UserEmail1 = Pattern.matches(REGEXP_TIGHT_USER_EMAIL, "adjh54@naver.com"); // true
Boolean isValidType2UserEmail2 = Pattern.matches(REGEXP_TIGHT_USER_EMAIL, "adjh_54@naver.com"); // true
Boolean isValidType2UserEmail3 = Pattern.matches(REGEXP_TIGHT_USER_EMAIL, "adjh^^_54@naver.com"); // false
/*
* 사용자 아이디에 대한 정규식 - 영문 숫자 조합 6~10자리
* "^[a-z]{1}[a-z0-9]{5,10}+$" 정규식 패턴
*/
Boolean isValidUserId1 = Pattern.matches(REGEXP_USER_ID, "adjh54"); // true
Boolean isValidUserId2 = Pattern.matches(REGEXP_USER_ID, "adjh"); // false
Boolean isValidUserId3 = Pattern.matches(REGEXP_USER_ID, "adjh_54"); // false
Boolean isValidUserId4 = Pattern.matches(REGEXP_USER_ID, "Adjh54"); // false
Boolean isValidUserId5 = Pattern.matches(REGEXP_USER_ID, "12adjh54"); // false
/*
* 사용자 패스워드에 대한 정규식 - 대소문자 + 숫자 + 특수문자 조합으로 10 ~ 128자리로 정의 한다.
* "^[a-z]{1}[a-z0-9]{5,10}+$" 정규식 패턴
*/
Boolean isValidUserPw1 = Pattern.matches(REGEXP_USER_PW_TYPE1, "qwer123456"); // true
Boolean isValidUserPw2 = Pattern.matches(REGEXP_USER_PW_TYPE1, "qwer1234!!"); // true
Boolean isValidUserPw3 = Pattern.matches(REGEXP_USER_PW_TYPE1, "Qwer1234!!"); // true
Boolean isValidUserPw4 = Pattern.matches(REGEXP_USER_PW_TYPE1, "패스워드!123"); // false
/*
* 핸드폰 번호 타입1에 대한 정규식 => ex) 01023205454
*/
Boolean isValidType1UserPhone1 = Pattern.matches(REGEXP_PHONE_TYPE1, "01912345678"); // true
Boolean isValidType1UserPhone2 = Pattern.matches(REGEXP_PHONE_TYPE1, "019123456789"); // false
Boolean isValidType1UserPhone3 = Pattern.matches(REGEXP_PHONE_TYPE2_1, "019-1234-5678"); // true
Boolean isValidType1UserPhone4 = Pattern.matches(REGEXP_PHONE_TYPE2_1, "019-1234-5678"); // true
Boolean isValidType1UserPhone5 = Pattern.matches(REGEXP_PHONE_TYPE2_2, "019-1234-5678"); // true
Boolean isValidType1UserPhone6 = Pattern.matches(REGEXP_PHONE_TYPE3, "+82-019-1234-5678"); // true
Boolean isValidType1UserPhone7 = Pattern.matches(REGEXP_PHONE_TYPE4, "+82-10-1234-5678"); // true
Boolean isValidRegistrationCode = Pattern.matches(REGEXP_REGISTRATION_NUM, "123456-1234567"); // true
Boolean isValidPostalCode = Pattern.matches(REGEXP_POSTAL_CODE, "123-45");
문자열에 대한 정규식
정규식 | 용도 |
"^[a-z|A-Z]*$" | 대소구분 없는 영문만 허용 |
"^[a-z]*$" | 소문자만 허용 |
"^[A-Z]*$" | 대문자만 허용 |
"^[ㄱ-ㅎ|가-힣]*$" | 한글만 허용 |
"^[a-z|A-Z|ㄱ-ㅎ|가-힣]*$" | 대소구분 없는 영문과 한글만 허용 |
"^[a-z|A-Z|ㄱ-ㅎ|가-힣| ]*$" | 대소구분 없는 영문과 한글만 허용 (스페이스바 포함) |
"^[0-9a-zA-Zㄱ-ㅎ가-힣]*$"; | 대소구분 없는 영문과 한글만 허용 |
"^[0-9a-zA-Zㄱ-ㅎ가-힣 ]*$"; | 대소구분 없는 영문과 한글, 숫자를 허용 (스페이스바 포함) |
사용 예시
/**
* [정규식 모음-2] '문자열'에 대한 정규식
*/
// 1. 대소구분 없는 영문만 허용하는 정규식
public static final String REGEXP_EN = "^[a-z|A-Z]*$";
// 2. 소문자만 허용하는 정규식
public static final String REGEXP_LOWER_CASE = "^[a-z]*$";
// 3. 대문자만 허용하는 정규식
public static final String REGEXP_UPPER_CASE = "^[A-Z]*$";
// 4. 한글만 허용하는 정규식
public static final String REGEXP_KR = "^[ㄱ-ㅎ|가-힣]*$";
// 5. 대소구분 없는 영문과 한글만 허용하는 정규식
public static final String REGEXP_ONLY_CHAR = "^[a-z|A-Z|ㄱ-ㅎ|가-힣]*$";
public static final String REGEXP_ONLY_SPACE_CHAR = "^[a-z|A-Z|ㄱ-ㅎ|가-힣| ]*$";
// 6. 대소구분 없는 영문과 한글, 숫자를 허용하는 정규식
public static final String REGEXP_CHAR_NUM = "^[0-9a-zA-Zㄱ-ㅎ가-힣]*$";
public static final String REGEXP_CHAR_SPACE_NUM = "^[0-9a-zA-Zㄱ-ㅎ가-힣 ]*$";
/*
* 대소문자의 알파벳만 허용합니다.(공백 허용 X)
* "^[a-z|A-Z]*$" 정규식 패턴 사용
*/
Boolean isEngStr1 = Pattern.matches(REGEXP_EN, "adJh"); // true
Boolean isEngStr2 = Pattern.matches(REGEXP_EN, "adJh54"); // false
/*
* 소문자의 허용합니다.(공백 허용 X)
* "^[a-z]*$" 정규식 패턴 사용
*/
Boolean isEngLowerCaseStr1 = Pattern.matches(REGEXP_LOWER_CASE, "adjh"); // true
Boolean isEngLowerCaseStr2 = Pattern.matches(REGEXP_LOWER_CASE, "ADJH"); // false
/*
* 대문자만 허용합니다.(공백 허용 X)
* "^[A-Z]*$" 정규식 패턴 사용
*/
Boolean isEngUpperCaseStr1 = Pattern.matches(REGEXP_UPPER_CASE, "adjh"); // false
Boolean isEngUpperCaseStr2 = Pattern.matches(REGEXP_UPPER_CASE, "ADJH"); // true
/*
* 한글만 허용합니다.(공백 허용 X)
* "^[ㄱ-ㅎ|가-힣]*$" 정규식 패턴 사용
*/
Boolean isKorStr1 = Pattern.matches(REGEXP_KR, "반갑습니다"); // true
Boolean isKorStr2 = Pattern.matches(REGEXP_KR, "adJh"); // false
/*
* 숫자와 특수문자를 제외한 문자만 허용합니다(공백 허용 X)
* "^[a-z|A-Z|ㄱ-ㅎ|가-힣]*$" 정규식 패턴 사용
*/
Boolean isNonSpecialChar1 = Pattern.matches(REGEXP_ONLY_CHAR, "반갑습니다adjh님"); // true
Boolean isNonSpecialChar2 = Pattern.matches(REGEXP_ONLY_CHAR, "반갑습니다^^"); // false
Boolean isNonSpecialChar3 = Pattern.matches(REGEXP_ONLY_CHAR, "반갑습니다 adjh님"); // false
/*
* 숫자와 특수문자를 제외한 문자만 허용합니다(공백 허용 O)
* "^[0-9a-zA-Zㄱ-ㅎ가-힣]*$" 정규식 패턴 사용
*/
Boolean isNonSpecialCharSpace1 = Pattern.matches(REGEXP_ONLY_SPACE_CHAR, "반갑습니다adjh님"); // true
Boolean isNonSpecialCharSpace2 = Pattern.matches(REGEXP_ONLY_SPACE_CHAR, "반갑습니다^^"); // false
Boolean isNonSpecialCharSpace3 = Pattern.matches(REGEXP_ONLY_SPACE_CHAR, "반갑습니다 adjh님"); // true
/*
* 특수문자를 제외한 문자만 허용합니다(공백 허용 X, 숫자 허용 O)
* "^[0-9a-zA-Zㄱ-ㅎ가-힣]*$" 정규식 패턴 사용
*/
Boolean isOnlyNonSpecialChar1 = Pattern.matches(REGEXP_CHAR_NUM, "반갑습니다adjh54님"); // true
Boolean isOnlyNonSpecialChar2 = Pattern.matches(REGEXP_CHAR_NUM, "반갑습니다^^"); // false
Boolean isOnlyNonSpecialChar3 = Pattern.matches(REGEXP_CHAR_NUM, "반갑습니다 adjh54님"); // false
/*
* 특수문자를 제외한 문자만 허용합니다(공백 허용 O, 숫자 허용 O)
* "^[0-9a-zA-Zㄱ-ㅎ가-힣 ]*$" 정규식 패턴 사용
*/
Boolean isOnlyNonSpecialCharSpace1 = Pattern.matches(REGEXP_CHAR_SPACE_NUM, "반갑습니다adjh54님"); // true
Boolean isOnlyNonSpecialCharSpace2 = Pattern.matches(REGEXP_CHAR_SPACE_NUM, "반갑습니다^^"); // false
Boolean isOnlyNonSpecialCharSpace3 = Pattern.matches(REGEXP_CHAR_SPACE_NUM, "반갑습니다 adjh54님"); // true
기타 날짜와 시간에 대한 정규식
정규식 패턴 | 설명 |
"^[\\d]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$" | 날짜에 대한 타입1에 대한 정규식 => ex) 2022-08-03 (YYYY-MM-DD) |
"^[\\d]{4}]\\/(0[1-9]|1[012])\\/(0[1-9]|[12][0-9]|3[01])$" | 날짜에 대한 타입2에 대한 정규식 => ex) 2022/08/03 (YYYY/MM/DD) |
"^[\\d]{4}\\.(0[1-9]|1[012])\\.(0[1-9]|[12][0-9]|3[01])$" | 날짜에 대한 타입에 대한 정규식 => ex) 2022.08.03 (YYYY.MM.DD) |
"^(19|20)[\\d]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$" | 날짜에 대한 정규식 => 19xx 20xx년도에 대해서 추가함 -- 강력하게 유효성 검증 |
"([0-2][0-9]{3})\\/([0-1][0-9])\\/([0-3][0-9]) ([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(([\\-\\+]([0-1][0-9])\\:00))?"; | 날짜에 대한 정규식 - YYYY/MM/DD hh:mi:ss |
"^([1-9]|[01][0-9]|2[0-3]):([0-5][0-9])$" | 시간에 대한 타입1에 대한 정규식 => ex) 13:47(HH24:mm) |
사용 예제
/**
* [정규식 모음-5] 날짜에 대한 정규식
*/
// [Soft] 날짜에 대한 타입1에 대한 정규식 => ex) 2022-08-03 (YYYY-MM-DD)
public static final String REGEXP_DATE_TYPE1 = "^[\\d]{4}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$";
// [Soft] 날짜에 대한 타입2에 대한 정규식 => ex) 2022/08/03 (YYYY/MM/DD)
public static final String REGEXP_DATE_TYPE2 = "^[\\d]{4}]\\/(0[1-9]|1[012])\\/(0[1-9]|[12][0-9]|3[01])$";
// [Soft] 날짜에 대한 타입에 대한 정규식 => ex) 2022.08.03 (YYYY.MM.DD)
public static final String REGEXP_DATE_TYPE3 = "^[\\d]{4}\\.(0[1-9]|1[012])\\.(0[1-9]|[12][0-9]|3[01])$";
// [Hard] 날짜에 대한 정규식 => 19xx 20xx년도에 대해서 추가함 -- 강력하게 유효성 검증
public static final String REGEXP_DATE_TYPE4 = "^(19|20)[\\d]{2}-(0[1-9]|1[012])-(0[1-9]|[12][0-9]|3[01])$";
// 날짜에 대한 정규식 - YYYY/MM/DD hh:mi:ss
public static final String REGEXP_DATE_TYPE5 =
"([0-2][0-9]{3})\\/([0-1][0-9])\\/([0-3][0-9]) ([0-5][0-9]):([0-5][0-9]):([0-5][0-9])(([\\-\\+]([0-1][0-9])\\:00))?";
/**
* [정규식 모음-6] 시간에 대한 정규식
*/
// 시간에 대한 타입1에 대한 정규식 => ex) 13:47(HH24:mm)
public static final String REGEXP_TIME_TYPE1 = "^([1-9]|[01][0-9]|2[0-3]):([0-5][0-9])$";
정규식을 위한 정규 메서드
: 해당 정규식을 기반으로 유효성 검증을 수행할지 아니면 치환할지 정한다.
1. Pattern Class (사용하기 위해서는 java.util.rege.Pattern 를 import 해야한다.)
: 정규식을 기반으로 문자열에 대한 검증을 수행한다.
Pattern Class 주요 매서드
메서드 | 기능 |
Pattern.matcher(String regex, CharSequence input) | 대상이 되는 문자열과 정규식이 일치하는 경우 true, 아닌 경우 false를 반환한다. |
Pattern.pattern() | 컴파일된 정규표현식을 String 형태로 반환한다. |
Pattern.compile(String regex) | 컴파일된 정규 표현식을 반환한다. |
Pattern.asPredicate() | 문자열을 일치시키는 데 사용할 수있는 술어를 작성한다. |
Pattern.split(CharSequence input) | 문자열을 주어진 인자값 CharSequence 패턴에 따라 분리한다. |
Pattern 플래그 값 사용(상수)
메서드 | 기능 |
Pattern.CANON_EQ | None 표준화된 매칭 모드를 활성화한다. |
Pattern.CASE_INSENSITIVE | 대소문자를 구분하지 않는다. |
Pattern.COMMENTS | 공백과 #으로 시작하는 주석이 무시된다. (라인의 끝까지) |
Pattern.MULTILINE | 수식 '^' 는 라인의 시작과, '$' 는 라인의 끝과 match 된다. |
Pattern.DOTALL | 수식 '.' 과 모든 문자가 match 된다. ('\n' 도 match에 포함) |
Pattern.UNICODE_CASE | 유니코드를 기준으로 대소문자 구분없이 match 시킨다. |
Pattern.UNIX_LINES | 수식 '.' 과 '^' 및 'ㅁ$' 의 match시에 한 라인의 끝을 의미하는 '\n'만 인식된다. |
사용 예시
/*
* 1. Pattern - matches() 메서드를 이용한 예시
* matches의 기본형태
* matches(정규표현식, 검증 대상 문자열)
*/
String Num1 = "1234";
String Num2 = "A1234";
String REGEXP_ONLY_NUM = "^[\\d]*$";
Boolean isNumber1 = Pattern.matches(REGEXP_ONLY_NUM, Num1); // 결과 true
Boolean isNumber2 = Pattern.matches(REGEXP_ONLY_NUM, Num2); // 결과 false
=> 이렇게 정규표현식을 사용하여 문자열을 검증할때는 java.util.rege.Pattern 클래스의 matches() 메서드를 활용한다.
2. Matcher Class ( 사용하기 위해서는 java.util.regex.Matcher 를 import해야한다.)
: 문자열 내에 일치하는 문자열을 확인하기 위해 정규식을 이용하여 찾고 존재여부를 반환해주는 함수이다.
메서드 | 뜻 |
matches() | 대상 문자열과 패턴이 일치할 경우 true 반환한다 . |
find() | 대상 문자열과 패턴이 일치하는 경우 true를 반환하고, 그 위치로 이동한다. |
find(int start) | start위치 이후부터 매칭검색을 수행한다. |
start() | 매칭되는 문자열 시작위치 반환한다 . |
start(int group) | 지정된 그룹이 매칭되는 시작위치 반환한다 . |
end() | 매칭되는 문자열 끝 다음 문자위치 반환한다 . |
end(int group) | 지정된 그룹이 매칭되는 끝 다음 문자위치 반환한다 . |
group() | 매칭된 부분을 반환한다. |
group(int group) | 매칭된 부분중 group번 그룹핑 매칭부분 반환한다. |
groupCount() | 패턴내 그룹핑한(괄호지정) 전체 갯수를 반환한다 . |
사용 예시
/*
* 2. Matcher - compile() & matcher
*/
String Num1 = "1234";
String Num2 = "A1234";
String REGEXP_ONLY_NUM = "^[\\d]*$";
Boolean pattern1 = Pattern.compile(REGEXP_ONLY_NUM).matcher(Num1).find();
Boolean pattern2 = Pattern.compile(REGEXP_ONLY_NUM).matcher(Num1).find();
3. ReplaceAll Class
: 문자열 내에 포함되어있는 문자를 제거 또는 대체하기 위해 정규식을 이용하여 찾고 치환해주는 함수이다.
: 문자열(String) 형태의 정규식과 변환하려는 문자열(String) 을 파라미터로 넣고 변환한 값을 문자열(String)으로 반환한다.
// API
public String replaceAll(String regex, String replacement) {
return Pattern.compile(regex).matcher(this).replaceAll(replacement);
}
String replaceAllStr = "A.B.C.D.E.F";
String removeDot = replaceAllStr.replaceAll("\\.", ""); // ABCDEF
String chageDotToHypen = replaceAllStr.replaceAll("\\.", "-"); // A-B-C-D-E-F
정규식을 테스트 해볼수있는 사이트
RegExr: Learn, Build, & Test RegEx
RegExr: Learn, Build, & Test RegEx
RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
regexr.com
참고한 글
[Java] 정규표현식(RegExp) 이해하기 : 패턴, 문자 클래스, 자주 사용 패턴 — Contributor9 (tistory.com)
[Java] 정규표현식(RegExp) 이해하기 : 패턴, 문자 클래스, 자주 사용 패턴
해당 글의 목적은 주요 정규식 조작함수를 이해하고 예제를 통한 이해를 돕기 위해 작성한 글입니다. 해당 글에서는 모든 함수에 대해서는 포함하고 있지 않으며 자주 사용되는 함수 위주로 작
adjh54.tistory.com
자바 정규 표현식 (Pattern, Matcher) 사용법&예제 (tistory.com)
자바 정규 표현식 (Pattern, Matcher) 사용법&예제
정규표현식은 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어입니다. 개발을 하다보면 특정한 형식, 예를 들어 전화번호, 주민등록번호, 이메일등과 같이 정해진 형식이
tichi.tistory.com
'웹 개발 > Java' 카테고리의 다른 글
[JAVA] 비밀번호 암호화 SHA-256 알고리즘 / 레인보우 테이블 / Salt (0) | 2024.02.23 |
---|---|
[Java] illegal modifier for parameter id only final is permitted (0) | 2024.02.22 |
[JAVA] 다차원 배열 (0) | 2024.01.27 |
[JAVA] 문자열 내 특정 문자 포함 여부 확인 / 문자열 내 특정 문자의 위치 찾기 (0) | 2024.01.24 |
[JAVA] 배열(Array)과 스트림(Stream) (0) | 2024.01.19 |