2009-09-13 5 views
28

정규 표현식을 사용하여 호스트 이름의 유효성을 검사합니다. 그것은 표준에 완전히 부합해야합니다. 지금, 나는호스트 이름 정규식

^[0-9a-z]([0-9a-z\-]{0,61}[0-9a-z])?(\.[0-9a-z](0-9a-z\-]{0,61}[0-9a-z])?)*$

을 가지고 있지만 그것은 연속 hypens 255 자보다 긴 호스트 이름을 수 있습니다. 완벽한 정규 표현식이 불가능하면 그렇게 말하십시오.

편집/설명 : Google 검색에서 이것이 해결 된 (또는 입증 된 해결 불가능한) 문제인 것으로 밝혀지지 않았습니다. 아무도 자신의 것을 쓸 필요가 없도록 최종 정규 표현식을 만들고 싶습니다. 방언이 중요한 경우,이를 수행 할 수있는 버전이 필요합니다.

답변

27

^(?=.{1,255}$)[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|-){0,61}[0-9A-Za-z])?)*\.?$

+2

뒤에 "."이있는 도메인을 허용하지 않습니다. 그렇지 않으면 작동합니다. – nicerobot

+0

수정 됨. 길이 어설 션이 255 이하인지 확인하는 대신 후미 점을 제외하고 254 이하인지 확인해야하는지 궁금합니다. 그렇지 않으면 행에있는 누군가가 최대 길이의 호스트 이름에 후행 점을 추가하고이를 중단시킬 수 있습니다. – CannibalSmith

+1

하이픈 앞에있는 \ b가 유효한 국제화 도메인 이름 (예 : xn--bcher-kva.ch. –

1

다음 질문을보십시오. 답변 중 일부는

당신이이 정규식을 사용하여 원하는 언어를 지정할 수 있습니다 호스트 이름에 대한 정규식 표현이? 대부분의 언어/시스템은 사람들의 대답에 영향을 미칠 약간 다른 정규식 구현을 가지고 있습니다.

+1

나는 .NET을 사용하고 있습니다,하지만 난 정규식이 가능한 휴대용되고 싶어 그래서 다른 사람들도 그것을 사용할 수 있습니다. – CannibalSmith

+0

Regex를 유지한다면 얻은 성과는 매우 휴대용 환경에서 계속 유지 될 것입니다. – Hardryv

4

귀하의 답변은 비교적 가까웠습니다.

그러나 볼

, 같은 :

(?:(?:(?:(?:[a-zA-Z0-9][-a-zA-Z0-9]{0,61})?[a-zA-Z0-9])[.])*(?:[a-zA-Z][-a-zA-Z0-9]{0,61}[a-zA-Z0-9]|[a-zA-Z])[.]?) 

선택적으로 끝을 고정 ^$ to only ma tch 호스트 이름.

Wikipedia에 따르면 단일 RE가 전체 유효성 검사를 수행 할 수 있다고 생각하지 않습니다. 255 자 길이 제한이 있기 때문에 동일한 RE에 포함될 수 있다고 생각합니다. 변경 사항은 있지만 RE를 실행하기 전에 길이가 < = 255인지 확인하기 만하면됩니다.

0

무엇에 대해 : 처음에 (일부 SRV에 대한) 하나의 '_'를 일치시키기위한

^(?=.{1,255})([0-9A-Za-z]|_{1}|\*{1}$)(?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?(?:\.[0-9A-Za-z](?:(?:[0-9A-Za-z]|\b-){0,61}[0-9A-Za-z])?)*\.?$ 

단 하나의 * (가 DNS 와일드 카드에 대한 레이블의 경우)

7

승인 된 답변은 여러 개의 점 (example..com)이 포함 된 잘못된 호스트 이름의 유효성을 검사합니다. 다음은 RFC 요구 사항에서 허용되는 것과 정확하게 일치한다고 생각하는 정규식입니다 (끝점 제외)."단락 상대적으로 명명 힘 FQDN 해상도) 일부 리졸버에 의해 지원

사양 :.

<hname> ::= <name>*["."<name>] 
<name> ::= <letter-or-digit>[*[<letter-or-digit-or-hyphen>]<letter-or-digit>] 

정규식 :

^([a-zA-Z0-9](?:(?:[a-zA-Z0-9-]*|(?<!-)\.(?![-.]))*[a-zA-Z0-9]+)?)$ 

내가 테스트 한 꽤 많은 순열 나 자신, I

이 정규 표현식은 길이 유효성 검사를 수행하지 않습니다. RFC에서 점과 이름 사이의 레이블에 대한 길이 제한이 필요하지만 길이는 쉽게 ch가 될 수 있습니다. 전체 문자열 길이를 검사하고 "."를 분리하고 모든 부분 문자열의 유효성을 검사하여이 정규식에 대해 유효성을 검사 한 후 두 번째 및 세 번째 패스로 ecked. 예 : 자바 스크립트에서 라벨 길이 유효성 확인은 "example.com".split(".").reduce(function (prev, curr) { return prev && curr.length <= 63; }, true)과 같을 수 있습니다.


대체 정규식 (부정 lookbehind없이, 예의 @thom_nic) :

^([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)+(\.([a-zA-Z0-9]+(-[a-zA-Z0-9‌​]+)*))*$

+1

나는 매우 비슷한이 함께 왔을 때 부정적인 lookbehind (감사 JS) 사용할 수 없습니다 :'^ ([a-zA Z0-9] + (- [a-zA-Z0-9] +) *) + ((a-zA-Z0-9) +))) * $'- 다시 길이를 검사하지 않지만 선행/후행/반복'-' 또는'.'을 검증하지 않습니다. 노출 된 호스트 이름 또는 FQDN에서 작동합니다. –

관련 문제