정규 표현식이란?
정규표현식이란?
정규표현식이란 사전적 의미로는 ‘특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식 언어이다.’라고 한다.
즉, 정규표현식은 문자열을 처리하는 데 사용되는 표현 방법 중 하나로, 특정한 규칙(패턴)을 정의해서 문자열에서 원하는 패턴을 찾아내거나 변경하는데 사용된다.
정규표현식으로 문자열의 패턴을 찾는다는 것은 다양한 경우에 사용된다
- 검색 엔진에서 검색어 처리
- 문자열 검색과 치화
- 유효성 검사
- DB에서 문자열 검색
- 로그 분석 및 처리
- 보안 검사 및 이메일 검증 등
위의 나열은 경우 말고도 많은 곳에 활용된다.
그럼 예시를 통해 정규표현식이 유용한 이유와 기본 문법에 대해 알아보자.
정규표현식 기본 문법
정규표현식의 문법은 언어마다 다를 수 있다. 여기서 다루는 정규표현식의 문법은 자바 기준!
표현식 | 설명 |
---|---|
^ | 문자열의 시작 |
. | 임의의 한 문자(필수 입력, 문자의 종류 상관 x) (\는 넣을 수 없음) |
* | 앞 문자가 없을 수도 있고, 무한정 많을 수도 있음 |
+ | 앞 문자가 하나 이상 |
? | 앞 문자가 없어가 하나있음 |
[] | 문자의 집합이나 범위를 나타내며 두 문자 사이는 - 기호로 범위를 나타냄 ([] 내에 ^가 선행하면 not을 나타냄 |
{} | 횟수 또는 범위를 나타냄 |
() | 소괄호 안의 문자를 하나의 문자로 인식 |
ㅣ | 패턴 안에서 or 연산 |
\s | 공백 문자 |
\S | 공백 문자가 아닌 나머지 문자 |
\w | 알파벳이나 숫자 |
\W | 알파벳이나 숫자를 제외한 문자 |
\d | 0~9 사이의 숫자 |
\D | 숫자를 제외한 모든 문자 |
\ | ’\’ 다음에 일반 문자가 오면 특수문자로 취급. ‘\’ 다음에 특수문자가 오면 그 문자 자체를 의미 |
(?i) | 앞 부분에 (?i) 옵션을 추가하면 대소문자를 구분하지 않음 |
유효성 검증을 위한 정규표현식
위에서 살펴봤던 정규표현식의 활용 부분에서 패턴 매칭을 통한 유효성 검사를 자세히 알아보자.
우리가 웹 사이트나 모바일 애플리케이션에서 회원가입을 진행하다 보면 다음과 같은 문구를 쉽게 볼 수 있다.
위의 문장을 해석해보자
- 길이는 5 ~ 20
- 영문 소문자, 숫자, 특수기호(“_”, “-“)만 입력 가능
- 영문 소문자, 숫자, 특수기호만 입력 가능한 것이지, 모두 포함될 필요는 없다.
정규표현식을 사용하지 않고 요청받은 문자열이 위의 조건을 만족하는 지 검사하는 코드를 우선 알아보자.
public static boolean validateString(String str) {
// 문자열이 null이거나, 길이가 5 미만 또는 20 초과이면 유효하지 않음
if (str == null || str.length() < 5 || str.length() > 20) {
return false;
}
// 문자열을 char 배열로 변환하여 하나씩 확인
char[] chars = str.toCharArray();
for (char c : chars) {
// 문자가 영문 소문자, 숫자, 특수기호(_),(-) 중 하나가 아니면 유효하지 않음
if (!(Character.isLowerCase(c) || Character.isDigit(c) || c == '_' || c == '-')) {
return false;
}
}
// 모든 문자가 영문 소문자, 숫자, 특수기호(_),(-)로만 이루어져 있으면 유효함
return true;
}
위의 코드를 정규표현식을 이용해 다시 작성해보자.
public static boolean validateString(String str) {
if (str == null) {
return false;
}
String regex = "^[a-z0-9_-]{5,20}$";
return str.matches(regex);
}
// ^ : 문자열의 시작을 나타내는 메타 문자입니다.
// [a-z0-9_-] : 소문자 알파벳(a부터 z)과 숫자(0부터 9) 그리고 특수문자 중 하나인 하이픈(-) 또는 밑줄(_) 중 하나를 나타내는 문자 클래스입니다.
// {5,20} : 앞의 문자 클래스가 5~20번 반복되어야 함을 나타내는 중괄호 표기입니다.
// $ : 문자열의 끝을 나타내는 메타 문자입니다.
위에서 작성한 정규표현식을 사용하지 않는 코드와 정규표현식을 사용한 코드를 보면 사용한 쪽이 훨씬 깔끔한 것을 볼 수 있다. 이렇게 정규표현식을 사용하면 다음과 같은 장점이 있다.
- 간결한 표현
- 정규표현식을 사용하면 간결하고 강력한 표현으로 다양한 패턴을 작성할 수 있다. 많은 코드를 단순화하고 가독성을 높일 수 있다.
- 재사용성(물론 정규표현식을 사용하지 않아도 재사용할 수 있다.) (자바 기준)
- 특정한 패턴을 여러 곳에서 재사용할 수 있다.
- 성능
- 자바에서는 ‘java.util.regex’ 패키지를 통해 정규표현식을 지원한다. 이 패키지는 정규표현식을 컴파일하여 패턴 매칭에 필요한 구조를 만들고, 해당 구조로 매칭을 수행하여 성능을 보장한다.
- 정규표현식을 컴파일하여 캐시에 저장한다. 이를 통해 동일한 패턴을 매번 컴파일하지 않고, 캐시에서 가져와서 사용할 수 있다. 이를 통해 성능을 높일 수 있다.