본문으로 건너뛰기

예시

URL

호스트 이름, 포트 번호, 경로로 이루어진 URL을 일치시킵니다.

정규 표현식:

https?:\/\/[-\w.]+(:\d+)?(\/([\w\/_.]*)?)?
https?:\/\/[-\w.]+(:\d+)?(\/([\w\/_.]*)?)?

완전한 URL

위 정규 표현식보다 완전하지만 느린 패턴입니다. 질의 문자열과 사용자 정보가 포함된 URL을 일치시킵니다.

정규 표현식:

https?:\/\/(\w*:\w*@)?[-\w.]+(:\d+)?(\/([\w\/_.]*(\?\S+)?)?)?
https?:\/\/(\w*:\w*@)?[-\w.]+(:\d+)?(\/([\w\/_.]*(\?\S+)?)?)?

(\w*:\w*@)은 사용자 이름과 암호가 포함된 경우를 처리합니다. (\?\S+)는 질의 문자열을 처리합니다.

이메일 주소

정규 표현식:

(\w+\.)*\w+@(\w+\.)+[A-Za-z]+
(\w+\.)*\w+@(\w+\.)+[A-Za-z]+

이 패턴으로는 올바른 형식을 한 이메일 주소를 모두 검증할 수 없습니다.

예를 들어 이 패턴은 잘못된 이메일 주소인 ben..forta@forta.com을 일치시킵니다. 그리고 호스트 이름에 IP 주소가 들어가는 올바른 이메일 주소를 불일치시킵니다.

그래도 대다수의 이메일 주소를 검사하는 것이 가능합니다.

신용카드 번호

신용카드에는 모두 간단한 숫자 매김 체계가 있는데, 몇 자리 특정 숫자를 필두로 나머지 숫자들이 따라옵니다.

마스터카드

16자리 숫자이고 첫 숫자는 항상 5이며, 두 번째 숫자는 1에서 5 사이입니다.

정규 표현식:

5[1-5]\d{14}
5[1-5]\d{14}

비자

4로 시작하고 13 자리나 16 자리 숫자로 이루어집니다.

정규 표현식:

4\d{12}(\d{3})?
4\d{12}(\d{3})?

아메리칸익스프레스

15 자리 숫자이고 34나 37로 시작합니다.

정규 표현식:

3[47]\d{13}
3[47]\d{13}

디스커버

18 자리 숫자이고 6011로 시작합니다.

정규 표현식:

6011\d{14}
6011\d{14}

다이너스클럽

14 자리 숫자로 300에서 305 사이 혹은 36이나 38로 시작합니다.

정규 표현식:

(30[0-5]|36\d|38\d)\d{11}
(30[0-5]|36\d|38\d)\d{11}

모두 포함하기

앞의 카드 번호 패턴들을 모두 포함하면 다음과 같습니다.

(5[1-5]\d{14})|(4\d{12}(\d{3})?)|(3[47]\d{13})|(6011\d{14})|((30[0-5]|36\d|38\d)\d{11})
(5[1-5]\d{14})|(4\d{12}(\d{3})?)|(3[47]\d{13})|(6011\d{14})|((30[0-5]|36\d|38\d)\d{11})

이 예시는 신용카드 번호가 시작하는 숫자와 길이가 맞는지를 확인하는 패턴입니다.

신용카드 번호가 정말로 유효한지는 모드 10(Mod 10)이라고 알려진 공식을 사용해야 합니다. 룬 알고리즘으로도 부르는 이 공식은 위키피디아에서 확인할 수 있습니다.

주민등록번호

전체 자릿수, 날짜 형식, 성별 숫자가 유효한 주민등록번호를 일치시킵니다.

\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}
\d{2}(0[1-9]|1[0-2])(0[1-9]|[12][0-9]|3[01])-[1-4]\d{6}

이 패턴의 한계는 날짜 형식이 완벽하지 않다는 점, 성별 숫자가 연도와 상관없다는 점입니다.

참고로 주민등록번호의 맨 뒷자리 숫자는 고유한 알고리즘으로 주민등록번호가 유효한지 확인합니다.

미국식 날짜 형식을 국제표준 날짜 형식으로 바꾸기

mm/dd/yyyy 날짜 형식을 yyyy-mm-dd 형식으로 변환해 보겠습니다.

정규 표현식:

([\d]{2})\/([\d]{2})\/([\d]{4})
([\d]{2})\/([\d]{2})\/([\d]{4})

치환 표현식:

$3-$1-$2
$3-$1-$2

정규 표현식의 한글과 유니코드

한글 일치시키기

한글은 \w에 포함되지 않는다는 것을 주의해야 합니다.

예시로 점수 구간 '수우미양가'를 찾는다고 가정해 보겠습니다.

예문:

국어: 수
영어: 수
수학: 수
미술: 양
체육: 가
국어: 수
영어: 수
수학: 수
미술: 양
체육: 가

정규 표현식:

수|우|미|양|가
수|우|미|양|가

[수우미양가]가 아닌 수|우|미|양|가인 것을 주목할 필요가 있습니다. 한글처럼 2 바이트 이상으로 이루어진 문자는 집합에서 제대로 인식이 안 되는 경우가 많습니다.

정규 표현식:

\b(수|우|미|양|가)\b
\b(수|우|미|양|가)\b

\b는 영단어의 경계만 나타내므로 위 정규 표현식은 의도대로 작동하지 않습니다.

대신 다음과 같이 전후방탐색을 이용할 수 있습니다.

정규 표현식:

(?<=\s)(수|우|미|양|가)(?=\s)
(?<=\s)(수|우|미|양|가)(?=\s)

만약 과목과 점수 사이에 공백이 없다면 다음 정규 표현식을 이용할 수 있습니다.

예문:

국어:수
영어:수
수학:수
미술:양
체육:가
국어:수
영어:수
수학:수
미술:양
체육:가

정규 표현식:

(?<=[^가-힣])(수|우|미|양|가)(?=[^가-힣])
(?<=[^가-힣])(수|우|미|양|가)(?=[^가-힣])

유니코드의 한글 문자 집합의 첫 번째 문자는 '가'이고 마지막 문자는 '힣'이기 때문에 [가-힣]로 한글 문자 집합을 표현할 수 있습니다.

유니코드 일치시키기

저작권 표시 와 같은 기호를 정규 표현식으로 표현하려면 유니코드 번호(Unicode code point)를 이용합니다.

정규 표현식:

`\u00a9`
`\u00a9`