Regular Expressions
유용한 정규식 쇼케이스
수색…
날짜 일치
정규식은 날짜 매칭을 위해 설계된 것임을 기억해야합니다. 날짜가 유효하다고 말하는 것은 많은 예외 처리가 필요하기 때문에 훨씬 더 복잡한 투쟁입니다 ( 윤년 조건 참조).
먼저 달 (1 - 12)을 선택적 선행 0 :
0?[1-9]|1[0-2]
요일과 일치하도록 선택적인 앞자리 0 :
0?[1-9]|[12][0-9]|3[01]
그리고 그 해를 맞추기 위해 (그냥 1900-2999 사이의 범위로 가정하십시오) :
(?:19|20)[0-9]{2}
구분 기호는 공백, 대시, 슬래시, 빈 등이 될 수 있습니다. 구분 기호로 사용할 수있는 느낌을 자유롭게 추가하십시오.
[-\\/ ]?
이제 모든 것을 연결하고 다음을 얻습니다.
(0?[1-9]|1[0-2])[-\\/ ]?(0?[1-9]|[12][0-9]|3[01])[-/ ]?(?:19|20)[0-9]{2} // MMDDYYYY
(0?[1-9]|[12][0-9]|3[01])[-\\/ ]?(0?[1-9]|1[0-2])[-/ ]?(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}[-\\/ ]?(0?[1-9]|1[0-2])[-/ ]?(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD
조금 더 현학적 인면을 원한다면 뒤쪽 참조를 사용하여 두 구분 기호가 같은지 확인하십시오.
(0?[1-9]|1[0-2])([-\\/ ]?)(0?[1-9]|[12][0-9]|3[01])\2(?:19|20)[0-9]{2} // MMDDYYYY
^ refer to [-/ ]
(0?[1-9]|[12][0-9]|3[01])([-\\/ ]?)(0?[1-9]|1[0-2])\2(?:19|20)[0-9]{2} // DDMMYYYY
(?:19|20)[0-9]{2}([-\\/ ]?)(0?[1-9]|1[0-2])\2(0?[1-9]|[12][0-9]|3[01]) // YYYYMMDD
이메일 주소 일치
문자열 내에서 전자 메일 주소를 일치시키는 것은 어려운 작업입니다 . RFC2822를 정의하는 사양이 복잡하기 때문에 정규식으로 구현하기가 어렵습니다. 전자 메일을 정규식과 일치시키는 것이 왜 좋은지에 대한 자세한 내용은 정규식 을 사용하지 않을 때 반 패턴 예제를 참조하십시오. 일치하는 전자 메일을 찾으십시오 . 이 페이지에서 참고할 수있는 가장 좋은 조언은 이것을 구현하기 위해 좋아하는 언어로 피어 리뷰 및 널리 사용되는 라이브러리를 사용하는 것입니다.
전자 메일 주소 형식 유효성 검사
항목을 신속하게 검증하여 전자 메일 처럼 보이게 할 때 가장 좋은 방법은 항목을 간단하게 유지하는 것입니다.
^\S{1,}@\S{2,}\.\S{2,}$
그 정규식은 메일 주소가 길이가 1보다 큰 문자의 비 공백으로 구분 된 순서이고 그 다음에 @
가오고 그 뒤에 두 개 이상의 공백이 아닌 두 개 이상의 연속 된 문자가 a로 분리되어 있는지 확인합니다 .
. 완벽하지는 않으며 형식에 따라 잘못된 주소의 유효성을 검사 할 수 있지만 가장 중요한 것은 올바른 주소가 무효화되지 않는 것입니다.
주소가 있는지 확인하십시오.
이메일이 유효한지 확인하는 유일한 방법은 그 존재를 확인하는 것입니다. 이전에는 VRFY
SMTP 명령이 그 목적을 위해 설계되었지만 슬프게도 스팸 발송자가 악용당한 후에 는 더 이상 사용할 수 없습니다 .
따라서 메일이 유효하고 존재하는지 확인하기 위해 남은 유일한 방법은 실제로 해당 주소로 전자 메일을 보내는 것입니다.
거대한 정규식 대안
하지만 정규식을 사용하여 주소 전자 메일의 유효성을 검사하는 것은 불가능하지 않습니다. 유일한 문제는 정규 표현식이 스펙에 더 가까울수록 더 커지고 결과적으로 읽기 및 유지가 어렵다는 것입니다. 아래에서는 일부 라이브러리에서 사용되는 더 정확한 정규 표현식의 예를 찾을 수 있습니다.
following 다음 정규식은 문서화 및 학습 목적으로 제공되며, 코드에 붙여 넣는 것은 좋지 않습니다. 대신 해당 라이브러리를 직접 사용하여 업스트림 코드 및 피어 개발자에게 전자 메일 구문 분석 코드를 최신 상태로 유지하고 유지 관리 할 수 있습니다.
Perl 주소 일치 모듈
이러한 정규 표현식의 가장 좋은 예는 일부 언어의 표준 라이브러리에 있습니다. 예를 들어, RFC::RFC822::Address
에 따라 가능한 한 정확하려고하는 Perl 라이브러리의 RFC::RFC822::Address
모듈 중 하나가 있습니다. 귀하의 호기심을 위해이 URL 에서 문법에서 생성 된 해당 정규식 버전을 찾을 수 있습니다. 붙여 넣기를 복사하려는 경우 정규식 작성자의 견적을 참고하십시오.
" 나는 정규 표현식을 유지하지 않는다. 이미 Perl 모듈에서 수정 된 버그가있을 수있다. "
.Net 주소 일치 모듈
또 다른 짧은 변형은 EmailAddressAttribute
모듈 의 .Net 표준 라이브러리에서 사용되는 것입니다.
^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$
그러나 그것이 더 짧 더라도 읽기 쉽고 유지하기 쉽기에는 여전히 너무 큽니다.
Ruby 주소 일치 모듈
루비에서는 rfc822 모듈 에서 정규 표현식을 사용하여 주소를 일치시킵니다. 버그가 발견 된 경우 정규 표현식을 변경하고 수정하는 것이 더 쉽습니다.
파이썬 주소 일치 모듈
예를 들어 파이썬 전자 메일 구문 분석 모듈 은 정규식을 사용하지 않고 대신 파서를 사용하여이를 구현합니다.
전화 번호 일치
다음은 접두어 코드 (a +
또는 (00) 다음에 1에서 1939까지의 숫자와 선택적 공백을 일치시키는 방법입니다).
유효한 접두어가 아니고 접두사 일 수 있습니다. 접두사의 전체 목록 보기
(?:00|\+)?[0-9]{4}
그런 다음 전체 전화 번호 길이가 최대 15 자이므로 최대 14 자리를 찾을 수 있습니다.
접두사에 적어도 한 자리 사용됩니다.
[0-9]{1,14}
숫자에는 공백, 점 또는 대시가 포함될 수 있으며 2 또는 3으로 그룹화 될 수 있습니다.
(?:[ .-][0-9]{3}){1,5}
선택적 접두어 사용 :
(?:(?:00|\+)?[0-9]{4})?(?:[ .-][0-9]{3}){1,5}
특정 국가 형식과 일치 시키려면이 검색어를 사용하여 국가를 추가하면됩니다. 질문은 이미 요청되었습니다.
IP 주소 일치
IPv4
IPv4 주소 형식을 일치 시키려면 숫자 [0-9]{1,3}
세 번 {3}
마침표로 구분하여 확인해야합니다 \.
다른 번호로 끝납니다.
^(?:[0-9]{1,3}\.){3}[0-9]{1,3}$
이 정규 표현식은 너무 간단합니다. 정확하기를 원한다면 위의 정규 표현식이 0
에서 255
사이인지 확인해야합니다. 위 정규 표현식은 어느 위치에서나 444
를 허용합니다. 25[0-5]
또는 기타 200의 값 2[0-4][0-9]
또는 100 이하의 값으로 [01]?[0-9][0-9]
하여 250-255를 확인 [01]?[0-9][0-9]
. 그 뒤에 \.
가 오는지 확인하고 싶습니다 \.
{3}
3 번 누른 다음 한 번없이.
^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
IPv6
(IPv6 주소는 콜론으로 구분 된 8 16 비트 육각 단어의 형태로 가지고 :
) 문자를. 이 경우에는 콜론이 따르는 7 개의 단어와 그렇지 않은 단어가 차례로 검사됩니다. 단어 제로를 선도 한 경우, 각 단어는 1 4 16 진수 사이에 포함 할 수 있습니다 의미 잘릴 수 있습니다.
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$
그러나 이것은 충분하지 않습니다. IPv6 주소가 상당히 "어리 석음"이 될 수 있으므로 표준에서는 제로 전용 단어를 ::
로 바꿀 수 있다고 규정하고 있습니다. 이것은 주소에서 한 번만 (1 ~ 7 개의 연속 단어 사이에) 수행 할 수 있습니다. 그렇지 않으면 불확정합니다. 이렇게하면 여러 가지 (다소 불쾌한) 변형이 생깁니다.
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,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}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
이제 교대로 교대로 정리하면 다음과 같이됩니다.
^(?:[0-9a-fA-F]{1,4}:){7}[0-9a-fA-F]{1,4}$|
^::(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,5}[0-9a-fA-F]{1,4}$|
^[0-9a-fA-F]{1,4}:[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,4}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,3}[0-9a-fA-F]{1,4}::(?:[0-9a-fA-F]{1,4}:){0,2}[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,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}:){0,5}[0-9a-fA-F]{1,4}::[0-9a-fA-F]{1,4}$|
^(?:[0-9a-fA-F]{1,4}:){0,6}[0-9a-fA-F]{1,4}::$
그것을 여러 줄 모드로 작성하고 여러 장의 주석으로 작성해야합니다. 따라서 무딘 물체로 여러분에게 오는 것이 아니라는 것을 알아내는 필연적 인 태도를 가진 사람이 누구인지 확인하십시오.
12 시간 및 24 시간 문자열 검증
12 시간 형식의 경우 다음 중 하나를 사용할 수 있습니다.
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9]\s*[ap]m$
어디에
-
(?:0?[0-9]|1[0-2])
는 시간 -
[-:]
는 필요에 맞게 조정할 수있는 구분 기호입니다. -
[0-5][0-9]
는 분입니다. -
\s*[ap]m
는 공백 문자를 따르고am
또는pm
초가 필요한 경우 :
^(?:0?[0-9]|1[0-2])[-:][0-5][0-9][-:][0-5][0-9]\s*[ap]m$
24 시간 형식 :
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9]$
어디에:
-
(?:[01][0-9]|2[0-3])
은 시간 -
[-:h]
필요에 맞게 조절할 수있는 구분 기호 -
[0-5][0-9]
는 분입니다.
초 :
^(?:[01][0-9]|2[0-3])[-:h][0-5][0-9][-:m][0-5][0-9]$
여기서 [-:m]
은 두 번째 분리 기호이고, h
는 몇 시간 동안 m
, 분은 [0-5][0-9]
가 두 번째 분리 기호입니다.
영국 우편 번호와 일치
영국의 우편 번호 와 일치하는 정규식
형식은 다음과 같습니다. 여기서 A는 문자 및 9 자리를 나타냅니다.
체재 | 적용 범위 | 예 |
---|---|---|
세포 | 세포 | |
AA9A 9AA | WC 우편 번호 영역; EC1-EC4, NW1W, SE1P, SW1 | EC1A 1BB |
A9A 9AA | E1W, N1C, N1P | W1A 0AX |
A9 9AA, A99 9AA | B, E, G, L, M, N, S, W | M1 1AE, B33 8TH |
AA9 9AA, AA99 9AA | 다른 모든 우편 번호 | CR2 6XH, DN55 1PT |
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY])))) [0-9][A-Z-[CIKMOV]]{2})
첫 번째 부분 :
(GIR 0AA)|((([A-Z-[QVX]][0-9][0-9]?)|(([A-Z-[QVX]][A-Z-[IJZ]][0-9][0-9]?)|(([A-Z-[QVX]][0-9][A-HJKPSTUW])|([A-Z-[QVX]][A-Z-[IJZ]][0-9][ABEHMNPRVWXY]))))
둘째:
[0-9][A-Z-[CIKMOV]]{2})