정규 표현식이란 문자열의 일정한 패턴을 표현하는 일종의 형식 언어다.
주로 문자열 검색, 데이터 유효성 검사(이메일, 전화번호 등), 텍스트 치환 등에 사용된다.
패턴 기반 검색
정규표현식은 단순한 문자열 검색이 아닌, 형태(패턴)를 기준으로 검색한다.
ex) 'apple'이라는 단어가 아니라 a[a-z]{4} 같은 규칙으로도 "apple"을 찾을 수 있다.
언어 및 도구 독립적
대부분의 프로그래밍 언어(예: Python, JavaScript, Java 등)와 텍스트 편집기(예: VS Code, Sublime Text)에서 사용 가능하다.
단점
.* 같은 그리디 패턴이 예상보다 많은 범위를 잡을 수 있어 주의 해야한다.그렇다면 어떻게 쓰는지 기본 문법에 대해 알아보자.
| 기호 | 의미 | 예시 |
|---|---|---|
| . | 아무 문자 한 개 | a.b → "aab", "acb" 등 |
| * | 앞 문자가 0번 이상 반복 | a*→ "", "a", "aaa" 등 |
| + | 앞 문자가 1번 이상 반복 | a+ → "a", "aa" 등 |
| ? | 앞 문자가 0번 또는 1번 | a? → "", "a" |
| [] | 문자 집합 | [abc] → "a", "b", "c" 중 하나 |
| [^] | 부정 문자 집합 | [^abc] → "a", "b", "c" 제외 |
| \d | 숫자 (0~9) | \d+ → 숫자 하나 이상 |
| \w | 문자 (알파벳+숫자+_) | \w+ |
| ^ | 문자열의 시작 | ^a → "a"로 시작 |
| $ | 문자열의 끝 | z$ → "z"로 끝남 |
| {n} | n번 반복 | a{3} → "aaa" |
| {n,m} | n~m번 반복 | a{2,4} → "aa", "aaa", "aaaa" |
그냥 문법만 보기에는 이해하기 힘든 부분이 많다. 그래서 예시를 들어서 설명해보려고 한다.
네이버 회원가입으로 예시를 들어보려고 한다. 우리는 회원가입 할 때 아이디, 비밀번호, 이름, 생년월일 등 내 정보를 기입한다. 그 때, 네이버에서 맞춰놓은 형식에 맞지 않으면 가입할 수 없다.
나는 아이디를 111로 지정하고싶었지만, 밑에 5~20자의 영문 소문자, 숫자와 특수기호(_),(-)만 사용 가능하다고 나와있다.
그렇다면 이런 조건은 어떻게 걸어야 할까?
먼저 허용 문자를 지정한다.
[a-z0-9_-] a-z : 영문 소문자 a~z를 말한다.0-9 : 숫자를 사용.-,_ : 특수문자 _와-만 사용.그 다음에는 길이를 지정한다.
[a-z0-9_-]{5,20}{5,20} : 5~20까지로 길이를 지정.마지막으로는 이렇게만 작성하면 '일치하는 부분'만 확인하기 때문에 우리는 문자열 전체를 확인하기 위해 시작과 끝인 ^,$을 넣어줘야 한다.
^[a-z0-9_-]{5,20}$마지막은 자바로 예시를 들어보겠다.
import java.util.regex.*;
public class IDValidator {
public static void main(String[] args) {
String userId = "gpt_user-1"; // 테스트할 아이디
String pattern = "^[a-z0-9_-]{5,20}$";
boolean isValid = Pattern.matches(pattern, userId);
if (isValid) {
System.out.println("유효한 아이디입니다.");
} else {
System.out.println("유효하지 않은 아이디입니다.");
}
}
}
기본 문법 이외 것들도 많고 Matcher class, ReplaceAll class도 있다. 그것들은 다음에 다뤄보도록 하겠다.