프로그래밍에서 문자열을 다룰 때, 문자열의 일정한 패턴을 표현하는 일종의 형식 언어.
텍스트 편집기나 스크립트 언어에서 문자열의 검색과 치환을 위해 지원한다.
정규 표현식에서 사용되는 기호
표현식 | 의미 |
---|---|
^x | 문자열의 시작을 표현, x문자로 시작됨을 의미한다. |
x$ | 문자열의 종료를 표현, x문자로 종료됨을 의미한다. |
.x | 임의의 한 문자의 자리수를 표현, 문자열이 x로 끝난다는 것을 의미한다. |
x+ | 반복을 표현, x문자가 한번 이상 반복됨을 의미한다. |
x? | 존재 여부를 표현, x문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다. |
x* | 반복 여부를 표현, x문자가 0번 또는 그 이상 반복됨을 의미한다. |
x | y |
(x)(y) | 그룹들의 집합을 표현, 앞에서부터 순서대로 번호를 부여하고 관리하고 x, y는 각 그룹의 데이터로 관리된다. |
(x)(?:y) | 그룹들의 집합에 대한 예외를 표현, 그룹 집합으로 관리되지 않음을 의미한다. |
x{n} | 반복을 표현, x문자가 n번 반복됨을 의미한다. |
x{n,} | 반복을 표현, x문자가 n번 이상 반복됨을 의미한다. |
x{n,m} | 반복을 표현, x문자가 최소 n번 이상 최대 m번 이하로 반복됨을 의미한다. |
정규표현식에서 자주 볼 수 있는 '[]'는 내부에 지정된 문자열의 범위 중에서 한 문자만을 선택해야한다는 특수한 의미를 가진다.
아래에 이처럼 특수한 용도를 가진 Meta 문자를 정리하겠다.
표현식 | 의미 |
---|---|
[xy] | 문자 선택을 표현, x와 y 중에 하나를 의미한다. |
[^xy] | not, x와 y를 제외한 문자를 의미한다. |
[x-y] | range, x ~ y 사이의 문자를 의미한다. |
^ | 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를 작성하지 않으면 대상 문자열에 대해서 검색을 한번만 하고 종료한다.
표현식 | 의미 |
---|---|
g | Global을 표현, 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다. |
i | Ignore case를 표현, 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다. |
m | Multi line을 표현, 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다. |
\d+
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
2-1. 이메일 심화 검사
/^[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_\.]?[0-9a-zA-Z])*\.[a-zA-Z]{2,3}$/i
/^\d{3}-\d{3,4}-\d{4}$/
주민등록번호 검사
\d{6}-[1-4]\d{6}
우편번호 검사
^\d{3}-\d{2}$
그래서 자바에서는 어떻게 사용하냐면!
자바에서는 정규표현식을 작성하기 위해 java.util.regex
패키지에 있는 클래스를 사용하면 된다. 보통 클라이언트 측에서 전송한 문자열 데이터가 형식에 맞는지 검사할 때 사용하며, Pattern 과 Matcher 클래스가 주로 사용된다.
⭐ matches(CharSequence input)
: 특정 문자열이 주어진 정규식에 매칭되는 지 테스트할 수 있다. boolean 값을 반환한다.
String pattern = "^[0-9]*$"; // 숫자만 등장하는지 (숫자 0개 이상)
String str = "123321";
boolean result = Pattern.matches(pattern, str);
// pattern -> 정규표현식 문자열, str -> 검사 대상 문자열
System.out.println(result); // true
compile(String regex)
: 주어진 정규표현식으로부터 패턴을 생성
pattern()
: 컴파일된 정규표현식을 String 형태로 변환
split(CharSequence input)
: 문자열을 주어진 인자값 패턴에 따라 분리하여 문자열 배열을 반환한다.
문자열의 패턴을 해석하고 주어진 패턴과 일치하는지 체크할 때 주로 사용한다.
Pattern 클래스와 마찬가지로 Matcher 클래스는 생성자가 없다.
Pattern 객체의 matcher() 메서드를 호출해서 얻을 수 있다!
Pattern pattern = Pattern.compile("^[0-9]*$");
String str = "04234234";
Matcher matcher = pattern.matcher(str);
System.out.println(matcher.find());
matches()
: 대상 문자열과 패턴이 일치하는 경우 true 반환
find()
: 대상 문자열과 패턴이 일치하는 경우 true 반환하고 그 위치로 이동
find(int start
: start 인자로 받은 위치부터 매칭 체크
start()
: 매칭되는 문자열의 시작 위치를 반환
start(int group)
: 지정된 그룹이 매칭되는 시작 위치를 반환
end()
: 매칭되는 문자열의 끝 바로 다음 위치를 반환
end(int group)
: 지정된 그룹이 매칭되는 끝 바로 다음 문자 위치를 반환
group()
: 매칭된 부분 반환
group(int group)
: 매칭된 부분 중 group번째 그루핑 매칭 부분을 반환
groupCount()
: 패턴 내 그루핑한 전체 개수를 반환
정규표현식 꼭 외우고 있자~!
Reference