개발 지식/Java
[Java] 정규표현식(Regular Expression, regex)
서하빈
2023. 7. 27. 14:56
정규표현식이란?
특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 형식 언어
정규표현식 문법
정규표현식 | 설명 |
^ | 문자의 시작(한 줄 기준) |
$ | 문자의 끝(한 줄 기준) |
. | 모든 문자 |
\\w | 문자만 허용(여기서 문자는 영문, 숫자 _를 의미) |
\\W | 문자가 아닌 경우에만 허용 |
\\d | 숫자만 허용 |
\\D | 숫자가 아닌 경우에만 허용 |
\\s | 공백 문자만 허용 |
\\S | 공백 문자가 아닌 경우에만 허용 |
\\b | 문자와 문자가 아닌 것의 경계 |
\\B | \\b와 반대로 동작 |
* | 앞의 대상이 0개 이상 |
+ | 앞의 대상이 1개 이상 |
? | 앞의 대상이 0개 또는 1개 |
{n} | n개 |
{n,} | n개 이상 |
{n, m} | n개 이상 m개 이하 |
() | 특정 그룹 |
[a-zA-Z] | 괄호안의 어떤 문자든 |
[^a-z] | 괄호안의 문자들은 제외 |
특수한 상황
- 수량자(*, +, ?) 뒤에 ?를 붙이게 되면 특수한 성질이 생기게 된다.
1. 앞의 수량자의 최소 범위가 선택되어진다.
*?의 경우 0개를, +?의 경우 1개를, ??의 경우 0개를 의미한다.
예) r.*? 의 경우 *의 의미가 0개를 의미하여 r 뒤에 어떠한 문자도 오지 않는 패턴을 의미하게 된다.
2. 게으른(lazy) 선택자가 된다.
greedy 선택자 vs lazy 선택자 예시
타겟 kim..gim..kim..gim 이면
정규표현식이 kim.+gim 인 경우에 탐욕적인 선택자가 되어 타겟 전체를 선택하지만
kim.+?gim 인 경우에는 게으른 선택자가 되어 kim..gim만을 선택하게 된다.
^, $ 와 \A, \Z 의 차이
^, $ 와 \A, \Z 의 차이는 멀티라인의 경우 전자는 각 라인마다 타겟을 지정하지만 후자는 전체 멀티라인의 처음과 끝만을 지정한다.
?= 의 의미
?=는 문자열을 검색하는데 사용하지만 직접 포함은 하지 않는 기능을 한다.
예) \w+(?=X) 의 경우 타겟 AAAX에서 AAA만을 포함하게 된다.
정규표현식 예제
1. 한글만
2. 이메일
3. 전화번호
4. 비밀번호
- 영문, 숫자, 특수문자를 포함하여 8자리 이상 24자리 이하의 비밀번호의 유효성 검사를 하고 싶을 때 위와 같이 두 가지 정규표현식을 세울 수 있다. 언뜻 보면 비슷해보이지만 두 정규식의 가장 큰 차이는 영문, 숫자, 특수문자가 각각 적어도 1개 이상 필수로 포함되어 있는지를 확인하는 것이다.
등등...