·정규식

정규식 133가지

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

표기법28

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

되풀이와 묶음17

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

앞뒤 살피기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

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

읽는 방법

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

자주 묻는 질문

Q. 정규식이 무엇인가요?

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

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

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

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

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

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

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

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

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