Я просматриваю регулярные выражения для проверки формата IP-адреса, и хотя у меня есть тот, который работает для полного IP-адреса (все 4 октета имеют значения), мое требование состоит в том, чтобы иметь возможность использовать подстановочные знаки на IP-адресе, таком как 65.66.100. * Или 65.66. *
Как можно изменить функцию ниже, чтобы включить такие условия, в которых пройдут два примера IP?
function ValidateIPaddress(ipaddress) {
if (/^(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]?)$/.test(ipaddress)) {
return (true)
}
alert("You have entered an invalid IP address!")
return (false)
}
Вы можете использовать это регулярное выражение из этого SO-ответа:
var regex = /^((((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]?))|(((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]?)\.){2}\*)|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1}\*))$/g;
он соответствует всем этим схемам:
1.2.*
1.2.3.*
1.2.3.4
Regex101: https://regex101.com/r/QnfVc4/1
поэтому ваш код будет выглядеть так:
function ValidateIPaddress(ipaddress) {
if (/^((((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]?))|(((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]?)\.){2}\*)|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1}\*))$/g.test(ipaddress)) {
return (true);
}
alert("You have entered an invalid IP address!")
return (false)
}
Демо-версия:
function ValidateIPaddress(ipaddress) {
if (/^((((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]?))|(((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]?)\.){2}\*)|(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){1}\*))$/g.test(ipaddress)) {
return (true);
}
//alert("You have entered an invalid IP address!")
return (false)
}
console.log("test for 127.0.0.1 ->", ValidateIPaddress("127.0.0.1"))
console.log("test for 127.0.0.* ->", ValidateIPaddress("127.0.0.*"))
console.log("test for 127.0.* ->", ValidateIPaddress("127.0.*"))
console.log("test for 127.* ->", ValidateIPaddress("127.*"))
console.log("test for 127.0 ->", ValidateIPaddress("127.0"))
1.*
а пока не должно.
Это должно соответствовать вашим потребностям:
^(?=(?:[^.]*\.){2,3}[^.]*$)(?: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]?)){1,3}(?:\.\*)?$
Это регулярное выражение должно делать то, что вы ищете:
^(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]?)|\*)|\*)$
Чтобы разбить его, я добавил два |
в конце вашего текущего регулярного выражения. Последний проверяет, что после последней точки присутствует либо число, либо *
, а одно до того, как проверяется, что два последних байта находятся либо в форме текущих чисел, либо просто являются *
.
Вы можете проверить его поведение здесь: https://regex101.com/r/jFq85T/1
*.65.66
или66.*.65.100
будут действительными?*.*.*.*
?