회원가입 폼에 이메일 검증을 달아야 하는데, 정규식 패턴을 하나 만들고 보니 제대로 작동하는지 확인할 방법이 마땅치 않다. 콘솔에서 하나씩 테스트하기엔 경우의 수가 너무 많다.
정규표현식 기본 문법 빠르게 보기
| 기호 | 의미 | 예시 |
|---|---|---|
. | 아무 문자 1개 | a.c → abc, a1c |
\d | 숫자 (0-9) | \d{3} → 010, 123 |
\w | 영문+숫자+밑줄 | \w+ → hello_1 |
+ | 1개 이상 반복 | a+ → a, aaa |
* | 0개 이상 반복 | ab*c → ac, abbc |
? | 0개 또는 1개 | colou?r → color, colour |
[ ] | 문자 클래스 | [a-z] → 소문자 1개 |
( ) | 캡처 그룹 | (\d+)-(\d+) |
이 정도만 알면 실무에서 필요한 패턴 대부분을 만들 수 있다. 문법을 외우는 것보다 직접 패턴을 넣고 결과를 보면서 익히는 게 훨씬 빠르다.
실무에서 바로 쓸 수 있는 패턴
이메일 검증
^[\w.-]+@[\w-]+\.[a-zA-Z]{2,}$
[email protected]은 통과하고 user@@com은 걸러낸다. 도메인 부분에 점이 최소 하나 있어야 한다는 조건이 핵심이다.
한국 전화번호
^01[016789]-?\d{3,4}-?\d{4}$
하이픈이 있든 없든 모두 매칭된다. 010-1234-5678, 01012345678 둘 다 통과한다.
한글만 허용
^[가-힣]+$
이름 입력 필드에서 영문이나 숫자를 걸러낼 때 쓴다. 자음이나 모음만 단독으로 들어오는 건 막지 못하니, 필요하면 [ㄱ-ㅎㅏ-ㅣ가-힣]으로 확장하면 된다.
플래그에 따라 결과가 달라진다
g(global)- 첫 번째 매칭만 찾는 게 아니라 텍스트 전체에서 모든 매칭을 찾는다
i(case-insensitive)- 대소문자를 구분하지 않는다.
/abc/i는 ABC, Abc 모두 매칭 m(multiline)^와$가 줄바꿈 단위로 적용된다. 여러 줄 텍스트를 검사할 때 필수
패턴이 맞는지 확인하는 방법
코드에 넣기 전에 먼저 테스트 환경에서 돌려보는 게 정석이다. 정규식 테스터에 패턴과 테스트 문자열을 넣으면 매칭되는 부분이 실시간으로 하이라이트 표시된다. 캡처 그룹 내용도 따로 보여주기 때문에, 괄호로 묶은 부분이 의도한 대로 잡히는지 바로 확인할 수 있다.
참고 정규표현식은 언어마다 미묘한 차이가 있다. JavaScript의\b는 한글 단어 경계를 인식하지 못하고, Python은 기본적으로.이 줄바꿈을 포함하지 않는다. 실제 사용할 언어 환경에서 최종 검증하는 걸 빠뜨리지 말자.
정규식을 잘 쓰면 수십 줄짜리 문자열 처리 코드가 한 줄로 줄어든다. 다만 복잡한 패턴은 본인도 나중에 못 읽는다. 패턴을 만들 때마다 테스트를 돌려보고, 주석으로 의도를 남겨두면 유지보수할 때 후회하지 않는다.