2016-07-29 4 views
1

정규식 목적은 문자열을 가져 와서 모든 호스트 이름의 목록을 만드는 것입니다. 그러나 그 오른쪽에서 3 개의 점만 가져옵니다.3 개의 도트로 도메인을 일치시키는 정규식

작동하지만 스크립트가 올바른 것이 아니라 호스트 이름의 왼쪽을 선택할 수 있음을 알 수 있습니다.

정규식

((([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){1,3}[a-zA-Z]{2,63}) 
이제

site.com1.site.com2.1.site.com3.2.1.site .COM 4.3.2.1 .site.com 5.4.3.21.site.com

site.com1.site.com2.1.site.com 3. 2.1.site.com 4.3

를 수정했습니다. 2.1.site.com 5.4.3. 당신이 그것을 위해 당신의 정규식을 사용하려면 2.1.site.com

+0

바꿀 수'[a-zA-Z0-9]와''로 [\ w ]'또는보다 엄격한'[: alnum :] ' –

+0

\ w에 밑줄이 있으므로 알고 있다고 생각합니다. alnum : "a-zA-Z0-9"와 동일하면 더 좋습니다. – JavaOdd

+0

그렇기 때문에 "엄격한"조건을 사용하려면': alnum :'을 사용해야한다고 말한 것입니다. 그렇지 않으면 URL에서 그렇지 않은 경우 거의 '_'을 찾을 수 없기 때문입니다. '\ w'는 간단히 짧습니다. 왜 당신은 모든 개행을 제거합니까? –

답변

1

, 당신은 확실히 우리가 문자열을 일치하도록 단지 {0,3} 발생으로 +을 제한하고, 마지막에 \b 단어 경계 (?!\.) 내다을 사용할 필요가 후행 단어 경계없이 그 후 점이 있어야한다 : + 정량는 정량화의 1 이상의 발생과 일치하는지

(([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){0,3}[a-zA-Z]{2,63}\b(?!\.) 
                   ^^^^^    ^^^^^^^^ 

regex demo

참고를 참조하십시오 {0,3} (bound) 한정 기호를 사용하면 o를 3 번만 일치시킬 수 있습니다. C++에서

, 당신은 overescaping 방지하기 위해 정규식을 정의하는 문자 그대로의 원시 문자열 ( R"(<PATTERN>)")를 사용할 수 있습니다

std::regex rx(R"((([a-zA-Z0-9]{1,63}|[a-zA-Z0-9][a-zA-Z0-9-]{0,61}[a-zA-Z0-9])\.){0,3}[a-zA-Z]{2,63}\b(?!\.))"); 
+0

을 읽는 것이 더 어렵습니다. 그러나 행에 두 개의 호스트 이름이 있으면 올바른 이름과 일치합니다. – JavaOdd

+0

그러나 이것이 귀하의 견본 입력이 제안하는 것입니다. 그렇다면 요구 사항은 무엇입니까? 관련 테스트 케이스를 질문에 추가하십시오. –

+0

예, 샘플 입력에서 제안했으나 각 줄뿐만 아니라 전체 텍스트 (또는 문자열)와 함께 작동해야합니다. – JavaOdd