Регулярное выражение для проверки IP-адреса
Я хочу проверить правильность значения IP-адреса или нет..!
Я использовал для проверки как
ValidIpAddressRegex = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$";
он работает нормально, но когда я даю значения как 12345678
, он также возвращает true.
Как это решить?
Ответы
Ответ 1
Существует более простой способ. Вам просто нужно разбить строку на .
и проверить, что каждое число находится между 0 и 255.
Кроме того, вы можете проверить hexa и разделить на :
для IPv6.
Просто потому, что я думаю, что это смешно:
^(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))\.(\d|[1-9]\d|1\d\d|2([0-4]\d|5[0-5]))$
Вот регулярное выражение, которое должно обрабатывать IP-адреса (v4).
Ответ 2
Это работает правильно для всех возможных случаев.
^(([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|2[0-5][0-5]|2[0-4]\d)$
Ответ 3
В поисках одного для IPv4 я просто создал его сам. (Это относится только к общему точечному варианту, то есть 0.0.0.0 - 255.255.255.255)
^ # START OF STRING
(?=\d+\.\d+\.\d+\.\d+$) # Lookahead, require this format: number.number.number.number END OF STRING
(?: # Start non-capture group (number 0-255 + optional dot)
(?: # Start non-capture group (number 0-255)
25[0-5] # 250-255
| # OR
2[0-4][0-9] # 200-249
| # OR
1[0-9]{2} # 100-199
| # OR
[1-9][0-9] # 10-99
| # OR
[0-9] # 0-9
) # End non-capture group
\.? # Optional dot (enforced in correct positions by lookahead)
){4} # End non-capture group (number + optional dot), repeat 4 times
$ # END OF STRING
Без комментариев:
^(?=\d+\.\d+\.\d+\.\d+$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}$
Некоторый код для его проверки:
function isValidIpv4Addr(ip) {
return /^(?=\d+\.\d+\.\d+\.\d+$)(?:(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.?){4}$/.test(ip);
}
var testAddr = ['192.68.35.35','0.0.0.0','255.0.0.0','192.168.1.0','192.168.0.1','255.255.255.0','1.1.1.1','255.255.255.255','249.249.249.249','200.200.200.200','199.199.199.199','100.100.100.100','99.99.99.99','0.0.0.0','9.9.9.9','10.10.10.10','99.99.99.99','100.100.100.100','109.109.109.109','110.110.110.110','199.199.199.199','200.200.200.200','249.249.249.249','250.250.250.250','255.255.255.255','256.256.256.260','192.168.0.0/24','192.168..1','192.168.1','1','1.','1.1','1.1.','1.1.1','1.1.1.','1.1.1.1.','1.1.1.1.1','.1.1.1.1','01.01.01.01','09.09.09.09','1.0.0.1.0','010.1.1.1','123456','123123123123','.127.0.0.1'];
for (var i = 0; i < testAddr.length; i++) {
document.getElementById('ipv4tests').innerHTML += '<li>' + testAddr[i] + ' ' + (isValidIpv4Addr(testAddr[i]) ? '<font color="green">VALID!</font>' : '<font color="red">INVALID!</font>') + '</li>';
}
<ul id="ipv4tests"></ul>
Ответ 4
Я знаю, что это старое, но попробуйте следующее:
/^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)(?:\:(?:\d|[1-9]\d{1,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5]))?$/
Я сделал это сегодня для функции в php.
Он обрабатывает ip от 0.0.0.0 до 255.255.255.255 и порты от 0 до 65535.
Примеры:
validates:
0.0.0.0:0
255.0.0.0
192.168.1.0:8080
does not validate:
192.168.0.0/24
192.168..1
192.168.1
Я знаю, что это frankenregex, но все же он работает!
Если порт не имеет значения, используйте его:
/^(?:(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)\.){3}(?:2[0-4]\d|25[0-5]|1\d{2}|[1-9]?\d)$/
Ответ 5
Вот решение:
^(([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))\.){3}([01]?[0-9]?[0-9]|2([0-4][0-9]|5[0-5]))$
Ответ 6
Вы также можете попробовать следующее:
^((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){4})$
Мы хотим, чтобы шаблон повторялся ровно четыре раза - в этом случае наш шаблон представляет собой число в диапазоне от 0 до 255, которому предшествует период .
или начало строки! Поскольку начало строки может происходить только один раз, остальные три события должны быть периодами.
Пожалуйста, ознакомьтесь с этой демонстрацией Regex 101 для полного объяснения.
Ответ 7
Простое расширение на @DavidFaber отличное решение. Для соответствия IPv4 "" Dotted decimal" обозначение (без диапазона/портов):
^(((1?[1-9]?|10|2[0-4])\d|25[0-5])($|\.(?!$))){4}$
Примеры соответствия: https://regex101.com/r/vX2hK4/15
Код для гольфа кто-нибудь?
Ответ 8
Этот reg ex работает хорошо, но поверьте мне, что это перебор.
Чтобы иметь условные сравнения, например здесь менее 255, лучше всего иметь комбинацию RegEx и условных обозначений.
^(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))\.(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))\.(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))\.(([0-1]?[0-9]?[0-9]{1})|(2?[0-4]?[0-9]{1})|(25[0-5]))$
Ответ 9
Попробуйте это укоротить:
^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(\.(?!$)|(?=$))){4}$
Вот тестовый пример для этого регулярного выражения:
function verifyIp(ip)
{
return /^(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])(\.(?!$)|(?=$))){4}$/.test(ip||"");
}
["192.68.35.35","0.0.0.0","255.0.0.0","192.168.1.0","192.168.0.1","255.255.255.0","1.1.1.1","255.255.255.255","249.249.249.249","200.200.200.200","199.199.199.199","100.100.100.100","99.99.99.99","0.0.0.0","9.9.9.9","10.10.10.10","99.99.99.99","100.100.100.100","109.109.109.109","110.110.110.110","199.199.199.199","200.200.200.200","249.249.249.249","250.250.250.250","255.255.255.255","256.256.256.260","192.168.0.0/24","192.168..1","192.168.1","1","1.","1.1","1.1.","1.1.1","1.1.1.","1.1.1.1.","1.1.1.1.1",".1.1.1.1","01.01.01.01","09.09.09.09","1.0.0.1.0","010.1.1.1","123456","123123123123",".127.0.0.1"].forEach(function(item){
is_valid = verifyIp(item);
$('<div>'+item+' <span class="'+(is_valid?'correct':'wrong')+'">'+(is_valid?'VALID':'INVALID')+'</span></div>').appendTo('#result');
});
.item {
font-weight: bold;
}
.wrong {
color: red;
}
.correct {
color: green;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>
Ответ 10
вы можете просто использовать это регулярное выражение для проверки любого IP-адреса без номера порта, как этот формат (192.168.1.1)
/^(?:(?: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]?)$/
Ответ 11
ПОПРОБУЙТЕ ЭТО,
ValidIpAddressRegex = "^(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]?)$"
Ответ 12
пытается сократить версию Grealy
^((1?\d?\d|2[0-4]\d|25[0-5])($|\.(?!$))){4}$
note: как и предыдущая версия, это неправильно обрабатывает восьмеричные числа, такие как 0177.0.0.1
Ответ 13
Вы также можете проверить мои выражения, я проверил и написал программу в java для проверки адреса ipv4. Он возвращает true, если адрес Ipv4 правильный или наоборот.
String pattern = "^ [[01]?\d\d? | 2 [0-4]\d | 25 [0-5]) \. ([01]?\d\d? | 2 [ 0-4]\д | 25 [0-5])\([01]\d\d |.? 2 [0-4]\д | 25 [0-5])\([01].?\d\d |? 2 [0-4]\d | 25 [0-5]) $"
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.Scanner;
class Solution{
public static void main(String []args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
String IP = in.next();
System.out.println(IP.matches(new MyRegex().pattern));
}
}
}
class MyRegex{
String pattern="^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\dCongrats, you solved this challenge!\\d?|2[0-4]\\d|25[0-5])$";
}
Ответ 14
Колин Хеберт указал на лучшее решение. Но никто не "объяснил", поставив для него код, поэтому здесь идет ( "Просто потому, что я думаю, что это смешно:";)
var aIP = [
'192.168.0.1',
'255.255.255.255',
'1.2.34.647',
'256.0.0.0',
'255,0,0,0',
'123.123.123',
'1.2.3.4.5'
];
aIP.forEach(function(ipAddr) {
var a = ipAddr.split('.'),
cnt = 4;
document.write('Testing ' + ipAddr + '<br/>');
try {
a.forEach(function(v) {
if( v<0 || v>255 )
throw false;
cnt--;
});
if( cnt!=0 )
throw false;
cnt--;
document.write('- Pass!<br/>');
}
catch (e) {
document.write('- Fail!<br/>');
}
});
Ответ 15
Попробуйте также:
(((?<![\d])([0-9][\.])|(?<![\d])([1-9][0-9][\.])|(?<![\d])(1[0-9]{2}[\.])|(?<![\d])(2[0-5][0-5][\.]))(([0-9][\.])|([1-9][0-9][\.])|(1[0-9]{2}[\.])|(2[0-5][0-5][\.])){2}(([0-9])(?![\d])|([1-9][0-9])(?![\d])|(1[0-9]{2})(?![\d])|(2[0-5][0-5])(?![\d])))
хотя это 5-летний вопрос, поэтому я сомневаюсь, что вы все еще ищете ответ.
отправил дополнительную информацию в другой поток:
Проверка адресов IPv4 с помощью regexp
Ответ 16
Это должно работать
^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$