値が有効な 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])$";
それは正常に動作していますが、のような値を与えると、それもtrue12345678を返します..これを解決するにはどうすればよいですか?
値が有効な 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])$";
それは正常に動作していますが、のような値を与えると、それもtrue12345678を返します..これを解決するにはどうすればよいですか?
もっと簡単な方法があります。文字列を分割して.、すべての数値が 0 から 255 の間であることを確認するだけです。
:さらに、 IPv6の hex と split on を確認できます。
面白いと思うから:
^(\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) を処理する正規表現です。
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>
This works properly for all possible cases.
^(([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)$
私はこれが古いことを知っていますが、これを試してください:
/^(?:(?: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の関数用に作りました。
0.0.0.0 から 255.255.255.255 までの IP と 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)$/
この短縮版を試してください:
^(([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>
@DavidFaber の優れたソリューションを拡張するだけです。IPv4 の「ドット付き 10 進数」表記に一致させるには (範囲/ポートなし):
^(((1?[1-9]?|10|2[0-4])\d|25[0-5])($|\.(?!$))){4}$
一致例: https://regex101.com/r/vX2hK4/15
コードゴルフの誰か?
これを試すこともできます:
^((?:(?:^|\.)(?:\d|[1-9]\d|1\d{2}|2[0-4]\d|25[0-5])){4})$
パターンを正確に 4 回繰り返す必要があります。この場合、パターンは 0 から 255 の範囲の数字の前にピリオド.または文字列の先頭を付けたものです。文字列の開始は 1 回しか発生しないため、残りの 3 回はピリオドでなければなりません。
Grealyのバージョンを短縮しようとしています
^((1?\d?\d|2[0-4]\d|25[0-5])($|\.(?!$))){4}$
注: 以前のバージョンでは、0177.0.0.1 のような 8 進数が正しく処理されません。
この正規表現はうまく機能しますが、やり過ぎだと信じてください。
ここのような条件付き比較を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]))$
与えられた式で確認することもできます.ipv4アドレスを検証するためにJavaでプログラムを確認して作成しました. Ipv4 アドレスが正しい場合、またはその逆の場合は true を返します。
文字列パターン="^([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]?\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])$";
}
Colin Hebert さんが最良の解決策を指摘してくれました。しかし、コードを提供して「説明」した人は誰もいないので、ここに行きます(「面白いと思うから:」;)
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/>');
}
});
これを試して、
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]?)$"
IPv4 には 0 から 255 までの数字の 4 つのブロックがあり、左側にパディング ゼロを含めることができます。各ブロックはドットで区切られています。
短くシンプルな IPv4 バリデータ:
var block "([0-1]{0,1}[0-9]{1,2}|2[0-4][0-9]|25[0-5]|)";
var ipv4 = "(" + block +"\\.){3}" + block ;
次のような IP を検証します。