Develop

[Java] 정규식 / 정규표현식 (RegExp) - 입력값 체크 본문

웹 개발/Java

[Java] 정규식 / 정규표현식 (RegExp) - 입력값 체크

개발 기록 2024. 2. 21. 13:41

정규식 / 정규표현식 (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+)? 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}$ 우편번호

 

정규식 용도
"^[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