it-swarm-ko.tech

IP 주소를 확인하는 자바 스크립트 정규식

다음과 같은 여러 IP 주소가 있습니다.

  1. 115.42.150.37
  2. 115.42.150.38
  3. 115.42.150.50

3 개의 IP 주소를 모두 검색하려면 어떤 유형의 정규식을 작성해야합니까? 예를 들어 115.42.150.* (3 개의 IP 주소를 모두 검색 할 수 있습니다)

내가 지금 할 수있는 것은 다음과 같습니다. /[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}/ 그러나 제대로 작동하지 않는 것 같습니다.

감사.

41
KennC.

정규식에는 이미 몇 가지 문제가 있습니다.

먼저 점이 포함되어 있습니다. 정규식에서 점은 "모든 문자 일치"를 의미하며 실제 점과 만 일치해야합니다. 이를 위해서는 탈출해야하므로 점 앞에 백 슬래시를 넣으십시오.

둘째, 각 섹션에서 세 자리 숫자와 일치합니다. 즉, 0에서 999 사이의 숫자와 일치하며 유효하지 않은 IP 주소가 많이 포함되어 있습니다.

이는 숫자 일치를 더 복잡하게하여 해결할 수 있습니다. 이 사이트에는 그 방법을 설명하는 다른 답변이 있지만 솔직히 노력할 가치가 없습니다. 제 의견으로는 문자열을 점으로 나누고 네 블록을 숫자로 확인하는 것이 훨씬 낫습니다. 정수 범위-즉 :

if(block >= 0 && block <= 255) {....}

희망이 도움이됩니다.

17
Spudley

늦을 수도 있지만 누군가 시도 할 수 있습니다.

유효한 IP 주소의 예

115.42.150.37
192.168.0.1
110.234.52.124

잘못된 IP 주소의 예

210.110 – must have 4 octets
255 – must have 4 octets
y.y.y.y – only digits are allowed
255.0.0.y – only digits are allowed
666.10.10.20 – octet number must be between [0-255]
4444.11.11.11 – octet number must be between [0-255]
33.3333.33.3 – octet number must be between [0-255]

IP 주소를 확인하는 JavaScript 코드

function ValidateIPaddress(ipaddress) {  
  if (/^(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]?)$/.test(ipaddress)) {  
    return (true)  
  }  
  alert("You have entered an invalid IP address!")  
  return (false)  
}  
88
ErickBest

이 버전을 사용해보십시오. 더 짧은 버전입니다.

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

설명 :

^ start of string
  (?!0)         Assume IP cannot start with 0
  (?!.*\.$)     Make sure string does not end with a dot
  (
    (
    1?\d?\d|   A single digit, two digits, or 100-199
    25[0-5]|   The numbers 250-255
    2[0-4]\d   The numbers 200-249
    )
  \.|$ the number must be followed by either a dot or end-of-string - to match the last number
  ){4}         Expect exactly four of these
$ end of string

브라우저 콘솔의 단위 테스트 :

var rx=/^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/;
var valid=['1.2.3.4','11.11.11.11','123.123.123.123','255.250.249.0','1.12.123.255','127.0.0.1','1.0.0.0'];
var invalid=['0.1.1.1','01.1.1.1','012.1.1.1','1.2.3.4.','1.2.3\n4','1.2.3.4\n','259.0.0.1','123.','1.2.3.4.5','.1.2.3.4','1,2,3,4','1.2.333.4','1.299.3.4'];
valid.forEach(function(s){if (!rx.test(s))console.log('bad valid: '+s);});
invalid.forEach(function(s){if (rx.test(s)) console.log('bad invalid: '+s);});
39
oriadam

Nodejs를 사용하는 경우 다음을 시도하십시오.

require('net').isIP('10.0.0.1')

doc net.isIP ()

17
Andrew K

이것을 시도하십시오. here 의 출처.

"\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"
15
Teja Kantamneni

최신 브라우저에서 ipv4에 대한 정규식보다 더 읽기 쉬운 것을 원한다면

function checkIsIPV4(entry) {
  var blocks = entry.split(".");
  if(blocks.length === 4) {
    return blocks.every(function(block) {
      return parseInt(block,10) >=0 && parseInt(block,10) <= 255;
    });
  }
  return false;
}
10
Ben McCormick

솔루션이 패딩 제로를 허용하지 않음

IP 주소를 확인하는 가장 확실한 방법은 다음과 같습니다.

Fact : 유효한 IP 주소는 4 octets, 각 8 진수는 0 - 255

정규식의 고장.

  • 25[0-5]250 - 255
  • 2[0-4][0-9]200 - 249
  • 1[0-9][0-9]100 - 199
  • [1-9][0-9]?1 - 99
  • 00

참고 :new RegExp\\. 대신에 \. 문자열이 두 번 이스케이프되므로.

function isValidIP(str) {
  const octet = '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)';
  const regex = new RegExp(`^${octet}\\.${octet}\\.${octet}\\.${octet}$`);
  return regex.test(str);
}
5
Mahdi Pedram
/^(?!.*\.$)((?!0\d)(1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/

oriadam 에 대한 완전한 크레딧. 나는 내가 만든 이중 제로 변화를 제안하기 위해 그의 대답 아래에 주석을 달았을 것입니다. 그러나 아직 여기에 충분한 평판이 없습니다 ...

변경 :

4
Tom

자신의 정규식이나 복사 붙여 넣기를 작성하지 마십시오! 모든 Edge cse (IPv6 및 8 진 IP 등)를 다루지는 않을 것입니다. 사용하다 is-ip npm부터 :

var isIp = require('is-ip');

isIp('192.168.0.1');

부울을 반환합니다.

Downvoters : 적극적으로 유지 관리되는 라이브러리를 사용하는 것이 웹 사이트에서 복사하여 붙여 넣는 것보다 더 나은 이유를 설명해야합니까?

4
mikemaccana

IP 주소 형식의 정규식 :

/^(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])\.(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])\.(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])$/;
3
waleed.arshad

늦게 공헌하다 :

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

내가 확인한 답변 중 확인 시간이 길거나 불완전합니다. 내 경험상 길어지면 간과하기가 더 어려워서 잘못되기 쉽다는 것을 의미합니다. 그리고 같은 이유로 비슷한 후두둑을 반복하는 것을 피하고 싶습니다.

주요 부분은 물론 0에서 255까지의 숫자 테스트이지만 초기 0을 허용하지 않는지 확인합니다 (단일 0 인 경우 제외).

[1-9]?\d|1\d\d|2(5[0-5]|[0-4]\d)

세 가지 대안-하위 100의 경우 하나 : [1-9]?\d, 하나는 100-199 : 1\d\d 및 마지막으로 200-255 : 2(5[0-5]|[0-4]\d).

여기에는 start of line 또는 .에 대한 테스트가 선행됩니다. 표현식은 추가 된 {4}에 의해 4 번 테스트됩니다.

이 4 바이트 표현에 대한이 완전한 테스트는 . : ^(?!\.)으로 시작하는 주소를 피하기 위해 줄의 시작을 테스트 한 다음 음수 모양을 미리보고 시작합니다. 줄 ($).

regex101에서 일부 샘플을 참조하십시오.

3
SamWhan

짧은 정규식 : ^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$

const isValidIp = value => (/^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$/.test(value) ? true : false);


// valid
console.log("isValidIp('0.0.0.0') ? ", isValidIp('0.0.0.0'));
console.log("isValidIp('115.42.150.37') ? ", isValidIp('115.42.150.37'));
console.log("isValidIp('192.168.0.1') ? ", isValidIp('192.168.0.1'));
console.log("isValidIp('110.234.52.124' ? ", isValidIp('110.234.52.124'));
console.log("isValidIp('115.42.150.37') ? ", isValidIp('115.42.150.37'));
console.log("isValidIp('115.42.150.38') ? ", isValidIp('115.42.150.38'));
console.log("isValidIp('115.42.150.50') ? ", isValidIp('115.42.150.50'));

// Invalid
console.log("isValidIp('210.110') ? ", isValidIp('210.110'));
console.log("isValidIp('255') ? ", isValidIp('255'));
console.log("isValidIp('y.y.y.y' ? ", isValidIp('y.y.y.y'));
console.log(" isValidIp('255.0.0.y') ? ", isValidIp('255.0.0.y'));
console.log("isValidIp('666.10.10.20') ? ", isValidIp('666.10.10.20'));
console.log("isValidIp('4444.11.11.11') ? ", isValidIp('4444.11.11.11'));
console.log("isValidIp('33.3333.33.3') ? ", isValidIp('33.3333.33.3'));
2
Ala Eddine JEBALI

그리고 대신

{1-3}

당신은 넣어야

{1,3}
2
Mikel

올바른 코드를 작성하면 다음과 같은 매우 간단한 정규식 만 필요합니다./\ d {1,3} /

function isIP(ip) {
    let arrIp = ip.split(".");
    if (arrIp.length !== 4) return "Invalid IP";
    let re = /\d{1,3}/;
    for (let oct of arrIp) {
        if (oct.match(re) === null) return "Invalid IP"
        if (Number(oct) < 0 || Number(oct) > 255)
            return "Invalid IP";
}
    return "Valid IP";
}

그러나 실제로 정규 표현식을 전혀 사용하지 않으면 더 간단한 코드를 얻을 수 있습니다.

function isIp(ip) {
    var arrIp = ip.split(".");
    if (arrIp.length !== 4) return "Invalid IP";
    for (let oct of arrIp) {
        if ( isNaN(oct) || Number(oct) < 0 || Number(oct) > 255)
            return "Invalid IP";
}
    return "Valid IP";
}
2
Mohsen Kadoura

Es6 메소드 인 내 버전, 유효한 IP의 경우 true, 그렇지 않으면 false

isIP(ip) {
  if (typeof(ip) !== 'string')
    return false;
  if (!ip.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)) {
    return false;
  }
  return ip.split('.').filter(octect => octect >= 0 && octect <= 255).length === 4;
}
2
geckos

항상 변형을 찾고 forEach를 사용하는 방법은 반복적 인 작업 인 것 같습니다!

function checkIP(ip) {
  //assume IP is valid to start, once false is found, always false
  var test = true;

  //uses forEach method to test each block of IPv4 address
  ip.split('.').forEach(validateIP4);

  if (!test) 
    alert("Invalid IP4 format\n"+ip) 
  else 
    alert("IP4 format correct\n"+ip);

  function validateIP4(num, index, arr) {
    //returns NaN if not an Int
    item = parseInt(num, 10);
    //test validates Int, 0-255 range and 4 bytes of address
    // && test; at end required because this function called for each block
    test = !isNaN(item) && !isNaN(num) && item >=0 && item < 256 && arr.length==4 && test;
  }
}
0
Dave Joyce

아마 더 낫습니다 :

function checkIP(ip) {
    var x = ip.split("."), x1, x2, x3, x4;

    if (x.length == 4) {
        x1 = parseInt(x[0], 10);
        x2 = parseInt(x[1], 10);
        x3 = parseInt(x[2], 10);
        x4 = parseInt(x[3], 10);

        if (isNaN(x1) || isNaN(x2) || isNaN(x3) || isNaN(x4)) {
            return false;
        }

        if ((x1 >= 0 && x1 <= 255) && (x2 >= 0 && x2 <= 255) && (x3 >= 0 && x3 <= 255) && (x4 >= 0 && x4 <= 255)) {
            return true;
        }
    }
    return false;
}    
0
user826822
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b

seachdata에 유효하지 않은 IP 주소가 포함되어 있지 않다면 0.0.0.0-999.999.999.999와 일치

\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

iP 번호와 일치 성을 일치시키는 데 사용-4 개의 숫자 각각이 자체 캡처 그룹에 저장되므로 나중에 액세스 할 수 있습니다.

0
pastacool