31

値が有効な IP アドレスかどうかを検証したい..!

以前は次のように検証していました

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

それは正常に動作していますが、のような値を与えると、それもtrue12345678を返します..これを解決するにはどうすればよいですか?

4

21 に答える 21

36

もっと簡単な方法があります。文字列を分割して.、すべての数値が 0 から 255 の間であることを確認するだけです。

:さらに、 IPv6の hex と split on を確認できます。


面白いと思うから:

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

これは、IP (v4) を処理する正規表現です。

于 2012-04-04T07:13:15.783 に答える
18

IPv4 用のものを探して、結局自分で作成することになりました。(これは一般的なドット付きバリアント、つまり 0.0.0.0 - 255.255.255.255 のみを処理します)

^                           # START OF STRING
  (?=\d+\.\d+\.\d+\.\d+$)     # Lookahead, require this format: number.number.number.number END OF STRING
  (?:                         # Start non-capture group (number 0-255 + optional dot)
    (?:                         # Start non-capture group (number 0-255)
      25[0-5]                     # 250-255
      |                           # OR
      2[0-4][0-9]                 # 200-249
      |                           # OR
      1[0-9]{2}                   # 100-199
      |                           # OR
      [1-9][0-9]                  # 10-99
      |                           # OR
      [0-9]                       # 0-9
    )                           # End non-capture group
    \.?                         # Optional dot (enforced in correct positions by lookahead)
  ){4}                        # End non-capture group (number + optional dot), repeat 4 times
$                           # END OF STRING

コメントを省く:

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

それをテストするためのいくつかのコード:

function isValidIpv4Addr(ip) {
  return /^(?=\d+\.\d+\.\d+\.\d+$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}$/.test(ip);
}
var testAddr = ['192.68.35.35','0.0.0.0','255.0.0.0','192.168.1.0','192.168.0.1','255.255.255.0','1.1.1.1','255.255.255.255','249.249.249.249','200.200.200.200','199.199.199.199','100.100.100.100','99.99.99.99','0.0.0.0','9.9.9.9','10.10.10.10','99.99.99.99','100.100.100.100','109.109.109.109','110.110.110.110','199.199.199.199','200.200.200.200','249.249.249.249','250.250.250.250','255.255.255.255','256.256.256.260','192.168.0.0/24','192.168..1','192.168.1','1','1.','1.1','1.1.','1.1.1','1.1.1.','1.1.1.1.','1.1.1.1.1','.1.1.1.1','01.01.01.01','09.09.09.09','1.0.0.1.0','010.1.1.1','123456','123123123123','.127.0.0.1'];
for (var i = 0; i < testAddr.length; i++) {
  document.getElementById('ipv4tests').innerHTML += '<li>' + testAddr[i] + ' ' + (isValidIpv4Addr(testAddr[i]) ? '<font color="green">VALID!</font>' : '<font color="red">INVALID!</font>') + '</li>';
}
<ul id="ipv4tests"></ul>

于 2014-10-31T09:19:20.770 に答える
12

This works properly for all possible cases.

^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$
于 2013-10-21T15:10:59.057 に答える
7

私はこれが古いことを知っていますが、これを試してください:

    /^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)(?:\:(?:\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/

今日はphpの関数用に作りました。

0.0.0.0 から 255.255.255.255 までの IP と 0 から 65535 までのポートを処理します。

例:

validates:
    0.0.0.0:0
    255.0.0.0
    192.168.1.0:8080
does not validate:
    192.168.0.0/24
    192.168..1
    192.168.1

これがfrankenregexであることは知っていますが、それでも機能します!

ポートが重要でない場合は、次のものを使用します。

    /^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)$/
于 2013-12-26T23:39:44.903 に答える
4

この短縮版を試してください:

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

この正規表現のテスト ケースは次のとおりです。

  function verifyIp(ip)
  {
    return /^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(\.(?!$)|(?=$))){4}$/.test(ip||"");
  }
  
  ["192.68.35.35","0.0.0.0","255.0.0.0","192.168.1.0","192.168.0.1","255.255.255.0","1.1.1.1","255.255.255.255","249.249.249.249","200.200.200.200","199.199.199.199","100.100.100.100","99.99.99.99","0.0.0.0","9.9.9.9","10.10.10.10","99.99.99.99","100.100.100.100","109.109.109.109","110.110.110.110","199.199.199.199","200.200.200.200","249.249.249.249","250.250.250.250","255.255.255.255","256.256.256.260","192.168.0.0/24","192.168..1","192.168.1","1","1.","1.1","1.1.","1.1.1","1.1.1.","1.1.1.1.","1.1.1.1.1",".1.1.1.1","01.01.01.01","09.09.09.09","1.0.0.1.0","010.1.1.1","123456","123123123123",".127.0.0.1"].forEach(function(item){
    is_valid = verifyIp(item);
    $('<div>'+item+' <span class="'+(is_valid?'correct':'wrong')+'">'+(is_valid?'VALID':'INVALID')+'</span></div>').appendTo('#result');
  });
.item {
  font-weight: bold;
}
.wrong {
  color: red;  
}

.correct {
  color: green;  
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

于 2016-05-24T11:43:45.747 に答える
2

@DavidFaber の優れたソリューションを拡張するだけです。IPv4 の「ドット付き 10 進数」表記に一致させるには (範囲/ポートなし):

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

一致例: https://regex101.com/r/vX2hK4/15

コードゴルフの誰か?

于 2015-02-11T03:31:01.477 に答える
1

これを試すこともできます:

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

パターンを正確に 4 回繰り返す必要があります。この場合、パターンは 0 から 255 の範囲の数字の前にピリオド.または文字列の先頭を付けたものです。文字列の開始は 1 回しか発生しないため、残りの 3 回はピリオドでなければなりません。

完全な説明については、この Regex 101 デモを参照してください。

于 2015-02-11T02:47:10.953 に答える
1

Grealyのバージョンを短縮しようとしています

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

注: 以前のバージョンでは、0177.0.0.1 のような 8 進数が正しく処理されません。

于 2016-02-10T12:47:20.987 に答える
1

この正規表現はうまく機能しますが、やり過ぎだと信じてください。
ここのような条件付き比較を255未満にするには、RegEx と条件付きの組み合わせを使用するのが最善です。

^(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))\.(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))\.(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))\.(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))$
于 2015-05-16T18:23:47.677 に答える
0

与えられた式で確認することもできます.ipv4アドレスを検証するためにJavaでプログラムを確認して作成しました. Ipv4 アドレスが正しい場合、またはその逆の場合は true を返します。

文字列パターン="^([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\d?|2[0-4] ]\d|25[0-5])\.([01]?\d\d?|2[0-4]\d|25[0-5])\.([01]?\d\ d?|2[0-4]\d|25[0-5])$"

import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;

class Solution{

    public static void main(String []args){
        Scanner in = new Scanner(System.in);
        while(in.hasNext()){
            String IP = in.next();
            System.out.println(IP.matches(new MyRegex().pattern));
        }

    }
}

    class MyRegex{
        String pattern="^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\dCongrats, you solved this challenge!\\d?|2[0-4]\\d|25[0-5])$";

}
于 2016-11-22T19:35:48.110 に答える
0

Colin Hebert さんが最良の解決策を指摘してくれました。しかし、コードを提供して「説明」した人は誰もいないので、ここに行きます(「面白いと思うから:」;)

var aIP = [
  '192.168.0.1',
  '255.255.255.255',
  '1.2.34.647',
  '256.0.0.0',
  '255,0,0,0',
  '123.123.123',
  '1.2.3.4.5'
  ];

aIP.forEach(function(ipAddr) {
  
  var a = ipAddr.split('.'),
      cnt = 4;

  document.write('Testing ' + ipAddr + '<br/>');

  try {
    a.forEach(function(v) {
      if( v<0 || v>255 )
        throw false;
      cnt--;
    });
    if( cnt!=0 )
        throw false;
      cnt--;
    document.write('- Pass!<br/>');
  }
  catch (e) {
    document.write('- Fail!<br/>');
  }
});

于 2016-12-02T15:06:36.590 に答える
0

これを試して、

ValidIpAddressRegex = "^(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]?)$"
于 2016-01-11T17:19:04.427 に答える
0

IPv4 には 0 から 255 までの数字の 4 つのブロックがあり、左側にパディング ゼロを含めることができます。各ブロックはドットで区切られています。

短くシンプルな IPv4 バリデータ:

var block "([0-1]{0,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|)";
var ipv4 = "(" + block +"\\.){3}" + block ;

次のような IP を検証します。

  • 000.12.12.034
  • 121.234.12.12
  • 23.45.12.56
  • 003.045.012.056
  • 03.45.12.6
  • 0.45.122.255
于 2019-02-12T11:01:22.840 に答える