정규식 133가지
표기법부터 이메일·날짜·주소 검사까지. 식마다 맞는 보기와 맞지 않는 보기를 함께 실었고, 그 보기가 실제로 그렇게 되는지 검사가 매번 돌려 봅니다.
표기법28
글자 하나를 어떻게 가리키는지 정하는 표기들입니다. 나머지는 모두 여기서 시작합니다.
\d숫자 한 글자\D숫자가 아닌 글자\w글자·숫자·밑줄\W글자·숫자·밑줄이 아닌 것\s공백 한 칸\S공백이 아닌 글자^.$아무 글자 하나^[a-z]+$영어 소문자만^[A-Z]+$영어 대문자만^[A-Za-z0-9]+$영문자와 숫자만^[^0-9]+$숫자가 하나도 없는 글^[가-힣]+$한글만^[ぁ-んァ-ヶー]+$가나만^[\u4e00-\u9fff]+$한자만^a\.b$점 자체^a/b$빗금이 들어간 글\t탭 문자\n줄바꿈 문자\r\n윈도식 줄바꿈^\u00e9$코드로 적은 글자^Hello이 말로 시작하는 글world$이 말로 끝나는 글^cat$이 말 하나뿐인 글\bcat\b낱말로 떨어진 자리\Bcat낱말 안쪽에 붙은 자리^cat$대소문자를 가리지 않는 맞춤^b줄마다의 첫머리^a.b$줄바꿈까지 포함한 아무 글자되풀이와 묶음17
몇 번 되풀이되는지, 어디까지를 한 묶음으로 볼지 정합니다.
^ab*c$없거나 여러 번^ab+c$한 번 이상^colou?r$있어도 되고 없어도 되는 글자^\d{4}$정확히 네 자리 숫자^\d{2,4}$두 자리에서 네 자리까지^\d{2,}$두 자리 이상<.+?>가장 짧게 잡는 태그 하나^<.+>$가장 길게 잡는 한 덩어리^(?:cat|dog)$둘 중 하나^(?:ab)+$두 글자 묶음의 되풀이^(\d{3})-(\d{4})$앞뒤 두 토막을 따로 잡기^(?:\d{3}-)+\d{4}$묶기만 하고 잡지는 않기^(?<year>\d{4})-(?<month>\d{2})$이름을 붙여 잡기(\w)\1같은 글자가 두 번 이어질 때\b(\w+)\s+\1\b같은 낱말이 두 번 이어질 때^(?:https?://)?example\.com$앞머리가 있어도 되고 없어도 되는 주소^(?:\d{1,3}\.){3}\d{1,3}$네 토막으로 된 주소앞뒤 살피기8
앞뒤에 무엇이 있는지 확인만 하고 잡아먹지는 않습니다. 조건을 겹쳐 걸 때 씁니다.
통째로 검사44
앞뒤가 묶여 있어 문자열 전체가 맞아야 통과합니다. 입력값 검사에 씁니다.
^[^\s@]+@[^\s@.]+(?:\.[^\s@.]+)+$이메일 주소^https?://[^\s/$.?#][^\s]*$웹 주소^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,}$도메인 이름^(?:(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)\.){3}(?:25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)$IPv4 주소^(?:[0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$생략 없이 적은 IPv6 주소^(?:[0-9a-f]{2}[:-]){5}[0-9a-f]{2}$MAC 주소^(?:6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]?\d{1,4})$포트 번호^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$UUID^#(?:[0-9a-f]{3}|[0-9a-f]{6})$16진수 색상 코드^rgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)$rgb() 색상 표기^\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])$ISO 형식 날짜^(?:0[1-9]|[12]\d|3[01])/(?:0[1-9]|1[0-2])/\d{4}$빗금으로 적은 날짜^(?:[01]\d|2[0-3]):[0-5]\d$24시간제 시각^(?:0?[1-9]|1[0-2]):[0-5]\d\s?(?:am|pm)$오전·오후를 붙인 시각^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$ISO 형식 날짜와 시각^P(?=\d|T\d)(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+S)?)?$ISO 형식 기간^\d+\.\d+\.\d+(?:-[0-9a-z.-]+)?(?:\+[0-9a-z.-]+)?$유의적 버전 번호^\d+$부호 없는 정수^[+-]?\d+$부호가 붙을 수 있는 정수^-?\d+(?:\.\d+)?$소수점이 있을 수 있는 수^-?\d+(?:\.\d+)?[eE][+-]?\d+$지수 표기로 적은 수^(?:100(?:\.0+)?|\d{1,2}(?:\.\d+)?)%$0에서 100까지의 백분율^\d{1,3}(?:,\d{3})*$세 자리마다 쉼표를 찍은 수^[$€£¥₩]\s?\d{1,3}(?:,\d{3})*(?:\.\d{2})?$통화 기호가 붙은 금액^[0-9a-f]+$16진수 문자열^[01]+$0과 1로만 된 문자열^[0-7]+$8진수 문자열^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$base64로 인코딩한 문자열^[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*$점 두 개로 나뉜 JWT^\+[1-9]\d{7,14}$국제 표준 전화번호^[a-z][a-z0-9_]{2,15}$영문자로 시작하는 아이디^[a-z0-9]+(?:-[a-z0-9]+)*$주소에 쓰는 낱말 잇기^[^\\/:*?"<>|]+\.[a-z0-9]+$확장자가 있는 파일 이름^.+\.(?:jpe?g|png|gif|webp|avif|svg)$그림 파일 확장자^/(?:[^/\0]+/)*[^/\0]*$유닉스식 경로^[A-Za-z]:\\(?:[^\\/:*?"<>|]+\\)*[^\\/:*?"<>|]*$윈도식 경로^</?[a-z][a-z0-9]*(?:\s[^<>]*)?/?>$HTML 태그 한 개^\.-?[_a-z][_a-z0-9-]*$CSS 클래스 선택자^M{0,3}(?:CM|CD|D?C{0,3})(?:XC|XL|L?X{0,3})(?:IX|IV|V?I{0,3})$로마 숫자^-?(?:90(?:\.0+)?|[1-8]?\d(?:\.\d+)?)$위도 값^-?(?:180(?:\.0+)?|1[0-7]\d(?:\.\d+)?|\d{1,2}(?:\.\d+)?)$경도 값^(?:0|[1-9]\d*)$앞에 0이 붙지 않은 수^\d*[02468]$짝수^\s*$아무것도 없는 줄골라내기와 다듬기36
글 안에서 필요한 부분만 찾아내거나 지울 때 씁니다.
\s+$줄 끝에 남은 공백^\s+줄 앞에 붙은 공백^\s+|\s+$앞뒤 공백\s{2,}두 칸 이상 이어진 공백\n\s*\n줄과 줄 사이의 빈 줄\D+숫자가 아닌 부분[^\x00-\x7F]아스키가 아닌 글자[\x00-\x1F]눈에 보이지 않는 제어 문자</?[^>]+>HTML 태그 부분<!--[\s\S]*?-->HTML 주석//.*$두 빗금으로 시작하는 주석/\*[\s\S]*?\*/여러 줄에 걸친 주석"[^"\\]*(?:\\.[^"\\]*)*"큰따옴표로 감싼 부분'[^'\\]*(?:\\.[^'\\]*)*'작은따옴표로 감싼 부분\[([^\]]+)\]\(([^)]+)\)마크다운 링크^#{1,6}\s+.+$마크다운 제목 줄(?:^|\s)#([a-z0-9_]+)해시태그(?:^|\s)@([a-z0-9_]{2,})골뱅이로 부르는 이름[?&]([^=&]+)=([^&]*)주소 뒤의 물음표 값https?://[^\s<>"]+글 속에 섞인 주소^https?://([^/:?#]+)주소에서 도메인만\.([a-z0-9]+)$파일 이름의 확장자(?<=[a-z0-9])(?=[A-Z])낙타 표기의 낱말 경계_([a-z])밑줄 뒤에 오는 글자-([a-z])붙임표 뒤에 오는 글자(?:^|,)("(?:[^"]|"")*"|[^,]+)쉼표로 나뉜 칸 하나^([^=]+)=(.*)$등호로 나뉜 이름과 값^\s*(\S+)첫 낱말(\S+)\s*$마지막 낱말\d+글 속의 숫자 덩어리\b\w+\b낱말 하나하나\[([^\]]*)\]대괄호 안의 내용\(([^)]*)\)괄호 안의 내용[\uD800-\uDBFF][\uDC00-\uDFFF]두 칸을 차지하는 이모지(.)\1{2,}같은 글자가 세 번 이상,\s*([}\]])닫기 전에 남은 쉼표읽는 방법
- 앞뒤에 ^와 $가 있으면 문자열 전체가 맞아야 합니다. 없으면 글 안 어디에서든 찾습니다 — 입력값 검사에는 반드시 붙이세요.
- 괄호 ( )는 잡아 두는 묶음입니다. 잡을 필요가 없으면 (?: )로 적어야 뒤의 번호가 밀리지 않습니다.
- 여기 실린 식은 모두 보기와 함께 검사를 거칩니다. 다만 "이메일 형식이 맞다"와 "실제로 받는 주소다"는 다른 이야기입니다.
- 길이가 정해지지 않은 되풀이가 겹치면(예: (a+)+) 입력에 따라 시간이 폭발할 수 있습니다. 남의 식을 그대로 쓸 때는 이 모양을 먼저 살피세요.
자주 묻는 질문
Q. 정규식이 무엇인가요?
글에서 찾을 모양을 적는 작은 언어입니다. "숫자 네 개" 대신 \d{4}라고 적으면, 프로그램이 그 모양에 맞는 부분을 찾아 줍니다. 자바스크립트·파이썬·자바 등 대부분의 언어가 거의 같은 표기를 씁니다.
Q. 이메일 검사는 왜 저렇게 짧은가요?
규격을 전부 반영한 이메일 식은 수천 자에 이르고, 그래도 실제로 받는 주소인지는 알 수 없습니다. 오타를 걸러 내는 정도가 정규식이 할 수 있는 일이고, 진짜 확인은 확인 메일을 보내는 것뿐입니다.
Q. 식이 왜 언어마다 조금씩 다른가요?
뼈대는 같지만 세부가 다릅니다. 자바스크립트에는 \A가 없고, 파이썬은 re.MULTILINE을 따로 켭니다. 여기 실린 식은 자바스크립트에서 그대로 돌아가는 형태로 적었습니다.
Q. 느려질 수 있다는 말은 무슨 뜻인가요?
(a+)+처럼 끝이 열린 되풀이가 겹치면, 맞지 않는 입력에서 되짚어 보는 경우의 수가 폭발합니다. 짧은 문자열에도 몇 초씩 걸릴 수 있어 서버에서는 위험합니다.
Q. 여기 실린 식은 믿어도 되나요?
식마다 맞아야 하는 보기와 맞으면 안 되는 보기를 함께 두고, 검사가 133개를 모두 실제로 돌려 봅니다. 화면에 보이는 보기가 곧 검사에 쓰이는 보기이므로, 설명과 식이 어긋난 채로 남을 수 없습니다.