[regex] 정규 표현식으로 IPv4 주소 유효성 검사

IPv4 유효성 검사를 위해 효율적인 정규식을 얻으려고 노력했지만 많은 운이 없었습니다. 언젠가 나는 그것을 가지고 있었던 것처럼 보였지만 (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}이상한 결과를 낳습니다.

$ grep --version
grep (GNU grep) 2.7
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.1
192.168.1.1
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.255
192.168.1.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.255.255
$ grep -E '\b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?(\.|$)){4}\b' <<< 192.168.1.2555
192.168.1.2555

나는 이것이 이미 질문하고 대답했는지 확인하기 위해 검색했지만 다른 대답은 단순히 1-3 개의 숫자로 된 4 그룹을 결정하는 방법을 보여 주거나 나를 위해 작동하지 않는 것 같습니다.



답변

이미 작동하는 대답을 얻었지만 원래 접근 방식에 무엇이 잘못되었는지 궁금한 경우 대답은 번갈아 가며 괄호가 필요하다는 것입니다. 그렇지 않으면 (\.|$)숫자가 200 미만인 경우에만 필요합니다.

'\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}\b'
    ^                                    ^


답변

^((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]?)$

동의 :

127.0.0.1
192.168.1.1
192.168.1.255
255.255.255.255
0.0.0.0
1.1.1.01

거부 :

30.168.1.255.1
127.1
192.168.1.256
-1.2.3.4
1.1.1.1.
3...3

단위 테스트로 온라인 시도 : https://www.debuggex.com/r/-EDZOqxTxhiTncN6/1


답변

가장 짧고 가장 읽기 어려운 최신 버전 ( 55 자 )

^((25[0-5]|(2[0-4]|1[0-9]|[1-9]|)[0-9])(\.(?!$)|$)){4}$

이 버전은 250-5 케이스를 찾은 후 케이스에 대해 가능한 모든 케이스를 영리하게 OR 처리합니다 200-249 100-199 10-99. 것을 알 수 |)부분은 실수가 아니라 실제로 논리합을 0-9 범위의 마지막 경우. ?:캡처 된 항목에 대해 실제로 신경 쓰지 않기 때문에 캡처하지 않는 그룹 부분 도 생략했습니다 . 처음에 전체 경기를하지 않으면 캡처되지 않을 것입니다.

이전 버전과 더 짧은 버전 (가독성이 낮음) ( 63 자 )

^(?:(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])(\.(?!$)|$)){4}$

이전 (읽을 수있는) 버전 ( 70 자 )

^(?:(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])(\.(?!$)|$)){4}$

부정적인 예견 (?!)을 사용하여 ip가 a로 끝날 수있는 경우를 제거합니다..

가장 오래된 답변 ( 115 자 )

^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}
    (?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$

나는 이것이 가장 정확하고 엄격한 정규식이라고 생각 000.021.01.0.합니다. 여기에있는 대부분의 다른 답변처럼 보이는 것과 같은 것을 받아들이지 않으며 그와 유사한 경우를 거부하기 위해 추가 정규식이 필요 0합니다..


답변

IPv4 주소 (정확한 캡처) 0.0.0.0에서 255.255.255.255까지 일치이 정규식을 사용하여 IP 번호를 정확하게 일치시킵니다. 4 개의 번호 각각은 캡처 그룹에 저장되므로 추가 처리를 위해 액세스 할 수 있습니다.

\b
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.
(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)
\b

JGsoft RegexBuddy 라이브러리에서 가져온

편집 :이 (\.|$)부분은 이상해 보인다


답변

나는 IPv4 주소와 비슷한 것을 찾고 있었는데, 일반적으로 사용되는 개인 ip 주소의 유효성 검사를 중지 한 정규식 (192.168.xy, 10.xyz, 172.16.xy)이이를 달성하기 위해 부정적인 예측을 사용했습니다.

(?!(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.).*)
(?!255\.255\.255\.255)(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|[1-9])
(\.(25[0-5]|2[0-4]\d|[1]\d\d|[1-9]\d|\d)){3}

(물론 한 줄에 있어야하며, 가독성을 위해 3 줄로 나누어야합니다.)
정규식 시각화

Debuggex 데모

속도에 최적화되어 있지 않을 수 있지만 ‘실제’인터넷 주소를 찾을 때만 잘 작동합니다.

실패 할 (그리고해야 할) 것들 :

0.1.2.3         (0.0.0.0/8 is reserved for some broadcasts)
10.1.2.3        (10.0.0.0/8 is considered private)
172.16.1.2      (172.16.0.0/12 is considered private)
172.31.1.2      (same as previous, but near the end of that range)
192.168.1.2     (192.168.0.0/16 is considered private)
255.255.255.255 (reserved broadcast is not an IP)
.2.3.4
1.2.3.
1.2.3.256
1.2.256.4
1.256.3.4
256.2.3.4
1.2.3.4.5
1..3.4

작동 할 (및 작동해야하는) IP :

1.0.1.0         (China)
8.8.8.8         (Google DNS in USA)
100.1.2.3       (USA)
172.15.1.2      (USA)
172.32.1.2      (USA)
192.167.1.2     (Italy)

다른 사람이 ‘공통 개인 주소를 포함하지 않는 인터넷 IP 주소’의 유효성을 확인하려는 경우 제공


답변

이 게시물을 읽는 많은 사람들은 기술적으로 유효하지 않은 IP 주소와 일치하더라도 더 간단한 정규식을 찾고있을 것이라고 생각합니다. (그리고 다른 곳에서 언급했듯이 정규식은 어쨌든 IP 주소를 올바르게 검증하는 데 적합한 도구가 아닐 수 있습니다.)

제거 ^교체, 해당되는 경우, 그리고 $함께 \b당신이 라인의 시작 / 끝과 일치하지 않으려면.

기본 정규식 (BRE) (GNU grep, GNU sed 및 vim에서 테스트 됨) :

/^[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+$/

확장 정규식 (ERE) :

/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/

또는:

/^([0-9]+(\.|$)){4}/

Perl 호환 정규식 (PCRE) (Perl 5.18에서 테스트 됨) :

/^\d+\.\d+\.\d+\.\d+$/

또는:

/^(\d+(\.|$)){4}/

Ruby (Ruby 2.1에서 테스트 됨) :

PCRE로 간주되지만 Ruby는 어떤 이유로 든 Perl 5.18에서 허용하지 않는이 정규식을 허용했습니다.

/^(\d+[\.$]){4}/

이 모든 것에 대한 나의 테스트는 여기에서 온라인 입니다.


답변

이것은 일부보다 약간 길지만 IPv4 주소를 일치시키는 데 사용하는 것입니다. 타협없이 간단합니다.

^((25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])$