我有这样的数据:
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/