·정규식

정규식 133가지

표기법부터 이메일·날짜·주소 검사까지. 식마다 맞는 보기와 맞지 않는 보기를 함께 실었고, 그 보기가 실제로 그렇게 되는지 검사가 매번 돌려 봅니다.

표기법36

글자 하나를 어떻게 가리키는지 정하는 표기들입니다. 나머지는 모두 여기서 시작합니다.

되풀이와 묶음24

몇 번 되풀이되는지, 어디까지를 한 묶음으로 볼지 정합니다.

앞뒤 살피기14

앞뒤에 무엇이 있는지 확인만 하고 잡아먹지는 않습니다. 조건을 겹쳐 걸 때 씁니다.

통째로 검사66

앞뒤가 묶여 있어 문자열 전체가 맞아야 통과합니다. 입력값 검사에 씁니다.

^[^\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*$아무것도 없는 줄^\d{4}-W(?:0[1-9]|[1-4]\d|5[0-3])$ISO 주 번호 — 쉰세 주까지^#(?:[0-9a-f]{4}|[0-9a-f]{8})$투명도까지 담은 열여섯 진법 색^\d{4}(?:[ -]?\d{4}){3}$네 자씩 네 묶음으로 적은 카드 번호^[A-Z]{3}$대문자 세 글자짜리 통화 부호^0x[0-9a-f]+$0x로 시작하는 열여섯 진법 수^[0-9a-f]{64}$예순네 자리 해시값^[0-9a-f]{24}$스물네 자리 문서 열쇠^\d{5}$다섯 자리 우편번호^[A-Z]{2}$두 글자 국가 코드^(\d{1,3}\.){3}\d{1,3}/\d{1,2}$대역 표기가 붙은 IPv4^01[016789]-?\d{3,4}-?\d{4}$휴대전화 번호^[가-힣]{2,5}$두 자에서 다섯 자 한글 이름^\d{5}(-\d{4})?$미국 우편번호^([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4})*)?::([0-9a-fA-F]{1,4}(:[0-9a-fA-F]{1,4})*)?$줄인 IPv6 주소^\d{3}-\d{2}-\d{5}$사업자등록번호^[a-z]+\/[a-zA-Z0-9][a-zA-Z0-9.+-]*$MIME 타입^data:[a-z]+\/[a-z0-9.+-]+;base64,[A-Za-z0-9+/]+=*$base64로 담은 data: 주소^(\S+\s+){4}\S+$다섯 칸짜리 크론 식^[A-Za-z]:\\.*$윈도 드라이브 경로^[\^~]?\d+\.\d+\.\d+$^·~가 붙은 버전 범위^(10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|172\.(1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3})$사설 IPv4 대역^[A-Z][a-zA-Z0-9]*$파스칼 표기 이름

골라내기와 다듬기49

글 안에서 필요한 부분만 찾아내거나 지울 때 씁니다.

\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*([}\]])닫기 전에 남은 쉼표\*\*([^*]+)\*\*별표 둘로 감싼 굵은 글씨`([^`]+)`역따옴표로 감싼 코드(\w+)="([^"]*)"따옴표로 값을 적은 속성\x1b\[[0-9;]*m터미널 빛깔을 바꾸는 제어 문자from ['\"]([^'\"]+)['\"]가져오는 파일 경로#[0-9a-fA-F]{6}\b글 속의 색 코드TODO:?\s*(.*)주석에 남긴 할 일\d+(px|em|rem|%)단위가 붙은 숫자!\[([^\]]*)\]\(([^)]+)\)마크다운 이미지^[-*+]\s+(.+)$마크다운 목록 항목--[^\n]*SQL 한 줄 주석\$\{?([A-Z_][A-Z0-9_]*)\}?셸 환경변수[A-Za-z0-9_-]{11}유튜브 영상 아이디

읽는 방법

  • 앞뒤에 ^와 $가 있으면 문자열 전체가 맞아야 합니다. 없으면 글 안 어디에서든 찾습니다 — 입력값 검사에는 반드시 붙이세요.
  • 괄호 ( )는 잡아 두는 묶음입니다. 잡을 필요가 없으면 (?: )로 적어야 뒤의 번호가 밀리지 않습니다.
  • 여기 실린 식은 모두 보기와 함께 검사를 거칩니다. 다만 "이메일 형식이 맞다"와 "실제로 받는 주소다"는 다른 이야기입니다.
  • 길이가 정해지지 않은 되풀이가 겹치면(예: (a+)+) 입력에 따라 시간이 폭발할 수 있습니다. 남의 식을 그대로 쓸 때는 이 모양을 먼저 살피세요.

자주 묻는 질문

Q정규식이 무엇인가요?

글에서 찾을 모양을 적는 작은 언어입니다. "숫자 네 개" 대신 \d{4}라고 적으면, 프로그램이 그 모양에 맞는 부분을 찾아 줍니다. 자바스크립트·파이썬·자바 등 대부분의 언어가 거의 같은 표기를 씁니다.

Q이메일 검사는 왜 저렇게 짧은가요?

규격을 전부 반영한 이메일 식은 수천 자에 이르고, 그래도 실제로 받는 주소인지는 알 수 없습니다. 오타를 걸러 내는 정도가 정규식이 할 수 있는 일이고, 진짜 확인은 확인 메일을 보내는 것뿐입니다.

Q식이 왜 언어마다 조금씩 다른가요?

뼈대는 같지만 세부가 다릅니다. 자바스크립트에는 \A가 없고, 파이썬은 re.MULTILINE을 따로 켭니다. 여기 실린 식은 자바스크립트에서 그대로 돌아가는 형태로 적었습니다.

Q느려질 수 있다는 말은 무슨 뜻인가요?

(a+)+처럼 끝이 열린 되풀이가 겹치면, 맞지 않는 입력에서 되짚어 보는 경우의 수가 폭발합니다. 짧은 문자열에도 몇 초씩 걸릴 수 있어 서버에서는 위험합니다.

Q여기 실린 식은 믿어도 되나요?

식마다 맞아야 하는 보기와 맞으면 안 되는 보기를 함께 두고, 검사가 133개를 모두 실제로 돌려 봅니다. 화면에 보이는 보기가 곧 검사에 쓰이는 보기이므로, 설명과 식이 어긋난 채로 남을 수 없습니다.