【问题标题】:Regular expression for IP Address ValidationIP 地址验证的正则表达式
【发布时间】:2012-04-17 21:15:49
【问题描述】:

我想验证该值是否是有效的 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])$";

它工作正常,但是当我给出像 12345678 这样的值时,它也返回 true.. 如何解决?

【问题讨论】:

  • "2001:0db8:85a3:0000:0000:8a2e:0370:7334" 根据该正则表达式也不是有效的 IP。 IPv6 是新标准 :)
  • 提示:下面的许多答案都使用\d,它比[0-9] 更紧凑,但如果您使用[0-9],它对正则表达式引擎更有效。见stackoverflow.com/questions/16621738
  • 我相信很多人都知道,4 个八位字节的点分十进制并不是唯一有效的 IPv4 格式。可以通过八进制 0010.0010.0010.0010、十六进制 0x08.0x08.0x08.0x08 和任意数量的其他格式访问 Google 的 8.8.8.8 服务器。大多数 IPv4 实现也会接受缺失的八位字节为有效。所以,8.8 变成了 8.0.0.8 - 是的,真的。最后,如果您正在测试“有效性”,您是否担心它是 RFC1918(“本地”)地址、多播或其他一些可能不是预期的地址(例如 C 类广播 .255 或网络 .o)?这个讨论可能会帮助superuser.com/questions/929153
  • 请使用我在这篇文章中的回答:stackoverflow.com/questions/23483855/…,这是迄今为止最准确的回答。

标签: javascript regex


【解决方案1】:

有一个更简单的方法。您只需要拆分. 上的字符串并检查每个数字是否在0 到255 之间。

此外,您可以检查 hexa 并在 : 上拆分 IPv6。


只是因为我觉得很有趣:

^(\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) 的正则表达式。

【讨论】:

  • 他们不必很庞大。我敢打赌你的代码比一个好的正则表达式要长。
  • @TJHeuvel,而且性能更高:)。正则表达式是一个有用的工具,但它是一个用于执行更复杂任务的大引擎,所以在这里使用正则表达式就像使用火箭筒捕捉苍蝇一样。您可能会完成它,但要付出什么代价?
  • 我认为这个删除了您版本中的冗余...(?<!\S)((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\b|\.\b){7}(?!\S)
  • 这是一个很好的例子,正则表达式可以解析文本但无法理解它们的语义。您无法使用正则表达式轻松判断数字必须在 0 到 255 之间,因为它无法仅理解数字文本。我会用 ([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+) 捕获正则表达式,并在没有常规的情况下验证它表达
  • 如何防止第一个数字为 0?
【解决方案2】:

为 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

没有 cmets:

^(?=\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>';
}
&lt;ul id="ipv4tests"&gt;&lt;/ul&gt;

【讨论】:

  • 优秀的文章解释了正则表达式的作用。这是一个基于您的正则表达式,它也将匹配 CIDR 表示法(不完美,但足够接近):^(?=\d+\.\d+\.\d+\.\d+(\/\d+)?$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}(?:\/(?:[0-9]|1[0-9]|2[0-9]|3[0-2]))?$
【解决方案3】:

这适用于所有可能的情况。

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

【讨论】:

  • 。2[0-5][0-5] 部分可以修改为 25[0-5],因为 2[0-4]\d 匹配从 200 到 249 的所有值。你的答案的简短版本是^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$ 很好的答案,顺便说一句。
  • 我通常不相信声称在所有可能的情况中都有效的东西。您是否进行了无限测试?或者得出一个数学证明?但是,在这种情况下,我认为这实际上是最好的解决方案,并且可能在所有情况下都能正常工作:)
  • 这里有一些对此正则表达式的测试,以证明它有效:refiddle.com/27uu
【解决方案4】:

我知道这是旧的,但试试这个:

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

【讨论】:

  • @DavidG 欢迎您。您看到的任何可以改进的地方,请在此处发表评论。
  • 伙伴,干得漂亮!在与此测试regex101.com/r/vX2hK4/14 正确匹配的四个答案中,您的答案是迄今为止表现最好的! jsperf.com/js-regex-ip-address(让我的回答感到羞耻)
  • @NickG 我从来不知道正则表达式可以那么快! o.O 我还会添加没有端口号的版本。我将在不同的浏览器和系统上对其进行测试。并感谢您花时间编写测试用例。
【解决方案5】:

试试这个缩短的:

^(([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>

【讨论】:

    【解决方案6】:

    这里是解决方案:

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

    【讨论】:

    【解决方案7】:

    只是扩展 @DavidFaber 的出色解决方案。要匹配 IPv4“Dotted decimal”表示法(无范围/端口):

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

    匹配示例: https://regex101.com/r/vX2hK4/15

    代码高尔夫有人吗?

    【讨论】:

    • 此扩展解决方案与.127.0.0.1 不正确匹配
    • 很好 @scentos,解决方案已更新以排除 . 前缀地址。
    • 包括可选的前导零^((0*)((1?[1-9]?|10|2[0-4])\d|25[0-5])($|\.(?!$))){4}$
    【解决方案8】:

    你也可以试试这个:

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

    我们希望模式准确重复四次 - 在这种情况下,我们的模式是 0 - 255 范围内的数字,前面有句点 . 或字符串的开头!由于字符串的开头只能出现一次,所以其他三个出现必须是句点。

    Please see this Regex 101 demo for a full explanation.

    【讨论】:

    • 当有前导点时不正确匹配,例如.1.1.1.1
    • @scentos,感谢您的更正。可以添加一个否定的前瞻来解决这个问题:(?!^\.):regex101.com/r/vX2hK4/10
    【解决方案9】:

    这个 reg ex 运行良好,但相信我,它有点矫枉过正。
    要进行像这里这样少于 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]))$
    

    【讨论】:

      【解决方案10】:

      试图缩短 Grealy 的版本

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

      注意:与以前的版本一样,它不能正确处理八进制数,例如 0177.0.0.1

      【讨论】:

      • 这是最短的发布解决方案。我只是将捕获组更改为非捕获以避免创建反向引用^(?:(?:1?\d?\d|2[0-4]\d|25[0-5])(?:$|\.(?!$))){4}$。见stackoverflow.com/q/5293986/1851290
      【解决方案11】:

      试试这个,

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

      【讨论】:

        【解决方案12】:

        您也可以检查我给定的表达式,我已经检查并用 java 编写了一个程序来验证 ipv4 地址。如果 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])$";
        
        }
        

        【讨论】:

          【解决方案13】:

          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/>');
            }
          });

          【讨论】:

            【解决方案14】:

            您可以简单地使用此正则表达式来验证任何没有端口号的 IP 地址,例如这种格式 (192.168.1.1)

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

            【讨论】:

              【解决方案15】:

              也试试这个:

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

              虽然这是一个已有 5 年历史的问题,但我怀疑您是否仍在寻找答案。

              在另一个线程上发布了更多信息: Validating IPv4 addresses with regexp

              【讨论】:

                【解决方案16】:

                为模式 前 192.168.23.28/255.255.255.0

                ^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)\/(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$
                

                为模式 前 192.168.26.82/24 或 192.168.23.28/255.255.255.0

                ^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)\/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))$
                

                为模式 前 192.168.26.28

                ^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)$
                

                用于网络掩码 前 255.255.255.0

                ^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$
                

                【讨论】:

                  【解决方案17】:

                  OP 要求验证 IP 地址。 Q 的措辞几乎肯定意味着 IPv4(与 IPv6 相对)。我已经对 OP 评论了有效性检查可能会走多远,并为一位响应者采取非 RE 方法而鼓掌。如果我在公共服务器上使用地址,我还想(在某些情况下)测试地址的有效性,我想出了以下 JS:

                  function isSimpleIPv4( ip, u=true ) {
                      if ((ip === undefined) || (ip === null) || (ip.length > 15)) return false;
                      var p = ip.split(\'.\');
                      if (p.length != 4) return false;
                      p.forEach( function(v,k){p[k]=Number(v);} );
                      if (isNaN(p[0]) || isNaN(p[1]) || isNaN(p[2]) || isNaN(p[3]) ) return false;
                      if ((p[0] < 1) || (p[0] > 255) || (p[1] < 0) || (p[1] > 255) || (p[2] < 0) || (p[2] > 255) || (p[3] < 0) || (p[3] > 255)) return false;
                      if (!u) return true;
                      if ((p[0] > 223)) return 'multicast';
                      if ((p[0] == 127)) return 'loopback';
                      if ((p[0] == 10)) return 'RFC1918';
                      if ((p[0] == 192) && (p[1] == 168)) return 'RFC1918';
                      if ((p[0] == 172) && (p[1] >= 16) && (p[1] <= 31)) return 'RFC1918';
                      return true;
                  }
                  

                  如果要检查“有用的”地址,则只需要字符串 IP,否则,如果只检查 0-255.0-255.0-255.0-255,则使用 IP 字符串调用函数并设置为 false。在前一种情况下,函数将返回真/假/什么时候是有用的“失败”原因。网站访问者打算使用的 RFC1918 地址将无法从公共服务器访问,甚至可能危及自己的服务器之一(如环回范围 127.x.x.x 中的地址)。同样,使用多播地址也无济于事。如果你对有用性检查感兴趣但不关心原因,那么你只需要做if (isSimpleIPv4(ipString) !== true) console.log('Not a valid and useful IP address');

                  【讨论】:

                    【解决方案18】:

                    IPv4 有 4 个从 0 到 255 的数字块,左侧可能包含填充零。每个块都用一个点隔开。

                    简短而简单的 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

                    【讨论】:

                      【解决方案19】:
                          import { Component } from '@angular/core';
                          import { FormBuilder, FormGroup, Validators }   from '@angular/forms';
                      
                          @Component({
                            selector: 'app-root',
                            templateUrl: './app.component.html',
                            styleUrls: ['./app.component.scss'],
                          })
                          export class AppComponent {
                            ipranging="";
                            testForm1: FormGroup;
                            testForm2: FormGroup;
                            constructor(private fb: FormBuilder){
                      
                            }
                            ngOnInit(): void {
                              const ipPattern = 
                              "(?:(?: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]?)";
                              this.testForm1 = this.fb.group({
                                inp: ['', Validators.pattern(ipPattern)],
                                inp3: ['', Validators.pattern(ipPattern)]
                              });
                              this.testForm2 = this.fb.group({
                                inp: ['', Validators.pattern(ipPattern)],
                                inp2: ['', Validators.pattern(ipPattern)],
                                inp3: ['', Validators.pattern(ipPattern)]
                              });
                              this.testForm2.setValidators(this.comparisionValidator);
                            }
                      
                            public comparisionValidator(group: FormGroup) : any{
                      
                              const control1 = group.controls['inp'];
                              const control2 = group.controls['inp2'];
                              var control1array  = control1.value.split('.');
                              var control2array = control2.value.split('.');
                      
                              if(parseInt(control1array[0]) > parseInt(control2array[0]) ){
                                group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
                                console.log(group); 
                              }
                              else if(parseInt(control1array[1]) > parseInt(control2array[1]) ){
                                group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
                                console.log(group); 
                              }
                              else if(parseInt(control1array[2]) > parseInt(control2array[2]) ){
                                group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
                                console.log(group); 
                              }
                              else if(parseInt(control1array[3]) > parseInt(control2array[3]) ){
                                group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
                                console.log(group); 
                              }
                              else {
                                group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': false });
                                console.log(group);
                              }   
                            }
                          }
                      

                      【讨论】:

                        【解决方案20】:
                            <div style="text-align:left">
                                <h2>Choose if you want to enter a single ip or range of ip's</h2>
                              <select  [(ngModel)]="ipranging">
                                <option  selected disabled value="none"> -- select an option -- </option>
                                <option  value='ip'>Single Ip address</option>
                                <option  value="range">Ip range</option>
                              </select>
                              </div>
                        
                            <form *ngIf="ipranging === 'ip'" novalidate [formGroup]="testForm1" class="render">
                              <label>IP Address: 
                                <input formControlName="inp" placeholder='0.0.0.0'/></label>
                                    <input formControlName="inp3" hidden/>
                                  <!-- <p *ngIf="testForm.controls.inp.status == 'INVALID' && testForm.controls.inp.value != ''" >Invalid</p>
                                  <p *ngIf="testForm.controls.inp2.status == 'INVALID' && testForm.controls.inp2.value != ''" >Invalid</p> -->
                                  <p *ngIf="testForm1.controls.inp.value != '' && testForm1.controls.inp.status == 'INVALID'" >Invalid</p>
                            </form>
                        
                            <form *ngIf="ipranging === 'range'" novalidate [formGroup]="testForm2" class="render">
                              <label>Starting IP:
                                <input formControlName="inp" placeholder='0.0.0.0'/></label>
                                  <label>
                                      Ending IP:
                                    <input formControlName="inp2" placeholder='0.0.0.0'/></label>
                                    <input formControlName="inp3" hidden/>
                                  <!-- <p *ngIf="testForm.controls.inp.status == 'INVALID' && testForm.controls.inp.value != ''" >Invalid</p>
                                  <p *ngIf="testForm.controls.inp2.status == 'INVALID' && testForm.controls.inp2.value != ''" >Invalid</p> -->
                                  <p *ngIf="testForm2.controls.inp.value != '' && testForm2.controls.inp.status == 'INVALID' || testForm2.controls.inp2.value != '' && testForm2.controls.inp2.status == 'INVALID'" >Invalid</p>
                                  <p *ngIf="testForm2.controls.inp3.errors.value2GreaterThanValue1 == true">Starting IP is larger than the ending IP</p>
                            </form>
                        

                        【讨论】:

                        • 不鼓励仅使用代码的答案。请添加一些解释,说明这是如何解决问题的,或者这与现有答案有何不同。 From Review
                        【解决方案21】:

                        这应该可以工作

                        ^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$
                        

                        【讨论】:

                        • 没有设置最大值为 255 的机制
                        猜你喜欢
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-06-20
                        相关资源
                        最近更新 更多