javascript - 单个字符串中的多个 ip 地址

标签 javascript regex

我有这样的数据:

172.12.1.3;185.16.6.13;...

有时子掩码可能是:

172.12.1.3;185.16.6.13/32;172.12.1.4;...

所以我想使用正则表达式(在 js 中)使用“;”来确保每个 IP 地址都是正确的作为分隔符。

应该不会太难,但即使经过一些研究,我也只是设法做到了这样的事情:

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

顺便说一句,我知道我应该,但我不是很喜欢正则表达式......

有人可以帮我一下吗?

编辑:

所以我尝试过这样的事情:

var poolIp = v.split(";");

var ipAddress = /^(((^|\.?)(1[0-9]{2}|[1-9][0-9]|[0-9]|2[0-4][0-9]|25[0-5])){4}(\;|$))*$/;
var ret = true;
for (var i = 0; i < poolIp.length; i++) {
    var matches = ipAddress.exec(poolIp[i]);
    if (!matches) {
        ret = false;
    }
}
return ret;

而且好多了,但是带子掩码的 ip 地址无效,带 3 位数字的 ip 有效。

最佳答案

您可以使用以下函数来验证此类 IP 地址字符串。请注意,可以增强端口号验证,我只是检查该值是否为数字。

function checkIsIPV4s(entry) {
  var ips = entry.split(';');       // Split into separate IPs
  for (var ip of ips) {
    var blocks = ip.split(/[.\/]/); // Split with dot and slash
    if(blocks.length === 5) {       // If there are 5 blocks,
      var last = blocks.pop();      //   remove the last one 
      if (!/^\d+$/.test(last)) {    //   and check if it is numeric
        return false;               //   if not - FALSE
      }
    }
    if(blocks.length === 4) {       // If block number is 4
      var res = blocks.every(function(block) { // check each part
        return parseInt(block,10) >=0 && parseInt(block,10) <= 255;
      });
      if (!res) {return false; }    // If any part is not in 0..255 - FALSE
    } else {  
      return false;                 // If block number is not 4 - FALSE
    }
  }
  return true;
}
var str = "172.12.1.3;185.16.6.13/32;172.12.1.4;255.255.255.255";
console.log(checkIsIPV4s(str));
str2 = "172.12.1.34444;185.16.6.13/32";
console.log(checkIsIPV4s(str2));

但是,也有一种方法可以使用巨大且不可读的正则表达式。添加这只是为了表明可以使用正则表达式来完成它:

/^(?:(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))\.){3}(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))(?:\/\d+)?(?:;(?:(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))\.){3}(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))(?:\/\d+)?)*$/

参见 regex demo

模式匹配:

  • ^ - 字符串的开始
  • (?:(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))\.) {3}(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))(?:\/\d+)? - 单个 IP 模式(全部到 (?:\/\d+)?),带有可选的端口号 ((?:\/\d+)?)
  • (?: - 非捕获组开始
    • ; - 分隔符
    • (?:(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))\.) {3}(?:\d{1,2}|1\d{2}|2(?:[0-4]\d|5[0-5]))(?:\/\d+)? - 单 IP 模式,同上
  • )* - 非捕获组序列出现 0 次或多次
  • $ - 字符串结尾。

关于javascript - 单个字符串中的多个 ip 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41011362/

相关文章:

javascript - 在多个 div 中具有相同类的元素外部单击时如何隐藏特定的 div

正则表达式匹配没有尾随空格的单词和单词组合

Python2正则表达式似乎有问题

php - preg_replace 仅删除结束标签

regex - 在 Django url 正则表达式模式中使用括号和破折号

javascript - "Rebind"调用 .unbind() 后出现 slider ?

javascript - mb_convert_encoding 对于 UTF7 字符串给出除 iconv 之外的其他结果

javascript - 为什么 `awaited`函数后面的函数没有被触发

javascript - 如果其中的 IMG 图像损坏,如何设置 DIV 的样式?

python - 从捕获组中查找以字符开头的所有可能的子字符串