Javascript и Regex для действующего IP с подстановочными знаками

1

Я просматриваю регулярные выражения для проверки формата 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)  
}  
  • 1
    Всегда ли должен быть подстановочный знак в конце, или значения типа *.65.66 или 66.*.65.100 будут действительными?
  • 1
    Означает ли это, что вы хотите разрешить строку типа *.*.*.* ?
Показать ещё 5 комментариев
Теги:

3 ответа

0
Лучший ответ

Вы можете использовать это регулярное выражение из этого 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"))
  • 0
    Это соответствует 1.* а пока не должно.
0

Это должно соответствовать вашим потребностям:

^(?=(?:[^.]*\.){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}(?:\.\*)?$

демонстрация

0

Это регулярное выражение должно делать то, что вы ищете:

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню