如何确定一个字符串是IP地址?无论是IPv4还是IPv6?
最少和最多需要多少个字符?
我认为这应该是一个正则表达式的答案。
如何确定一个字符串是IP地址?无论是IPv4还是IPv6?
最少和最多需要多少个字符?
我认为这应该是一个正则表达式的答案。
.NET中有一个IPAddress类型,它有一个方便的方法TryParse。
例子:
if(System.Net.IPAddress.TryParse(PossibleIPAddress, validatedIPAddress)){
//validatedIPAddress is good
}
// or more simply:
bool IsValidIPAddress(string possibleIP){
return System.Net.IPAddress.TryParse(PossibleIPAddress, null)
}
我以前做过这个,但我喜欢 Raymond Chen 在这篇文章中的建议:
http://blogs.msdn.com/oldnewthing/archive/2006/05/22/603788.aspx
他基本上支持使用正则表达式来找出标记。然后再对结果进行评估。他的例子如下:
function isDottedIPv4(s)
{
var match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
return match != null &&
match[1] <= 255 && match[2] <= 255 &&
match[3] <= 255 && match[4] <= 255;
}
看这个东西并理解它的预期功能要容易得多。
对于IPv4,您可以使用以下正则表达式。
\b(?:(?: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]?)\b
看起来很复杂,但它通过将每个四边形限制在0-255的数字范围内来实现。
由于正则表达式的一半处理了最后一段没有句号的情况,如果在可能的IP地址末尾添加一个“.”,则可以将其减少一半。
像这样:
bool IsValidIPAddress(string possibleIP){
CrazyRegex = \b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){4}\b
return Regex.Match(possibleIP+'.', CrazyRegex)
}
@unsliced,你说得没错,但这当然取决于实现方式。如果你正在从访问你网站的用户那里解析IP地址,那么你可以使用正则表达式,因为它应该是x.x.x.x格式。
对于IPv6,你可以使用这个
[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}:[A-F0-9]{0,4}
然而,它并不能捕获所有内容,因为在IPv6中,情况要复杂得多。根据维基百科的说法,所有以下示例在技术上都是正确的,但是上面的正则表达式只会捕获带有*的那些。
2001:0db8:0000:0000:0000:0000:1428:57ab*
2001:0db8:0000:0000:0000::1428:57ab*
2001:0db8:0:0:0:0:1428:57ab*
2001:0db8:0:0::1428:57ab
2001:0db8::1428:57ab
2001:db8::1428:57ab
IPv4地址
这是一个可以验证格式但不能验证逻辑的模式
按Enter键验证格式 999.999.999.999
然后,我加入了一个改进版的此答案来处理逻辑
const isValidOctet = (num,index) => num <= 255 && (index < 2 ? num >= 1 : num >= 0);
window.addEventListener('DOMContentLoaded', () => {
document.getElementById('txtSignDSCIPAdd').addEventListener('input', (e) => {
const tgt = e.target;
tgt.setCustomValidity('');
const s = tgt.value.trim();
const match = s.match(/^(\d+)\.(\d+)\.(\d+)\.(\d+)$/);
const valid = match != null &&
isValidOctet(+match[1],0) &&
isValidOctet(+match[2],1) &&
isValidOctet(+match[3],2) &&
isValidOctet(+match[4],3);
if (match && !valid) {
console.log(isValidOctet(match[0],valid,+match[1],0),isValidOctet(+match[2],1),isValidOctet(+match[3],2),isValidOctet(+match[4],3))
tgt.setCustomValidity(`The entered IP address is not valid (match: ${match[0]}, valid: ${valid})`);
tgt.reportValidity();
}
});
// while testing
document.querySelector('form').addEventListener('submit',(e) => { console.log('Submitted'); e.preventDefault() })
});
<form>
<label for="">Signet/DSC IP Address</label>
<span class="mandatory" style="color: red;">*</span>
<input type="text" class="form-control" id="txtSignDSCIPAdd" pattern="\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}" required/>
</form>
IPv4变成:/\d\d?\d?.\d\d?\d?.\d\d?\d?.\d\d?\d?/
我不确定IPv6的规则。