次のようなIPアドレスがいくつかあります。
115.42.150.37
115.42.150.38
115.42.150.50
3つのIPアドレスすべてを検索する場合、どのタイプの正規表現を作成する必要がありますか?たとえば、_115.42.150.*
(3つのIPアドレスすべてを検索できます)
私が今できることは次のようなものです:/[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}\.[0-9]{1-3}/
しかし、うまく機能していないようです。
ありがとう。
あなたが持っている正規表現にはすでにいくつかの問題があります:
まず、ドットが含まれています。正規表現では、ドットは「任意の文字に一致する」ことを意味し、実際のドットにのみ一致する必要があります。このためには、エスケープする必要があるため、ドットの前にバックスラッシュを入れてください。
次に、各セクションの3桁の数字に一致しています。これは、0から999までの任意の番号と一致することを意味します。これには、明らかに無効なIPアドレス番号が多数含まれています。
これは、数値のマッチングをより複雑にすることで解決できます。このサイトにはそれを行う方法を説明する他の回答がありますが、率直に言って努力する価値はありません-私の意見では、文字列をドットで分割し、4つのブロックを数値として検証する方がはるかに良いでしょう整数範囲-すなわち:
if(block >= 0 && block <= 255) {....}
お役に立てば幸いです。
遅れるかもしれませんが、誰かが試すことができます:
有効なIPアドレスの例
115.42.150.37
192.168.0.1
110.234.52.124
無効なIPアドレスの例
210.110 – must have 4 octets
255 – must have 4 octets
y.y.y.y – only digits are allowed
255.0.0.y – only digits are allowed
666.10.10.20 – octet number must be between [0-255]
4444.11.11.11 – octet number must be between [0-255]
33.3333.33.3 – octet number must be between [0-255]
IPアドレスを検証するJavaScriptコード
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)
}
これを試してください、それはより短いバージョンです:
^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$
説明:
^ start of string
(?!0) Assume IP cannot start with 0
(?!.*\.$) Make sure string does not end with a dot
(
(
1?\d?\d| A single digit, two digits, or 100-199
25[0-5]| The numbers 250-255
2[0-4]\d The numbers 200-249
)
\.|$ the number must be followed by either a dot or end-of-string - to match the last number
){4} Expect exactly four of these
$ end of string
ブラウザのコンソールの単体テスト:
var rx=/^(?!0)(?!.*\.$)((1?\d?\d|25[0-5]|2[0-4]\d)(\.|$)){4}$/;
var valid=['1.2.3.4','11.11.11.11','123.123.123.123','255.250.249.0','1.12.123.255','127.0.0.1','1.0.0.0'];
var invalid=['0.1.1.1','01.1.1.1','012.1.1.1','1.2.3.4.','1.2.3\n4','1.2.3.4\n','259.0.0.1','123.','1.2.3.4.5','.1.2.3.4','1,2,3,4','1.2.333.4','1.299.3.4'];
valid.forEach(function(s){if (!rx.test(s))console.log('bad valid: '+s);});
invalid.forEach(function(s){if (rx.test(s)) console.log('bad invalid: '+s);});
これを試してみてください。 here からのソース。
"\b(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]?)\b"
最新のブラウザでipv4の正規表現よりも読みやすいものが必要な場合は、
function checkIsIPV4(entry) {
var blocks = entry.split(".");
if(blocks.length === 4) {
return blocks.every(function(block) {
return parseInt(block,10) >=0 && parseInt(block,10) <= 255;
});
}
return false;
}
以下のソリューションはパディングゼロを受け入れません
IPアドレスを検証する最もクリーンな方法を次に示します。それを分類しましょう。
事実:有効なIPアドレスには4 octets
があり、各オクテットは0 - 255
正規表現の内訳。
25[0-5]
は250 - 255
と一致します2[0-4][0-9]
は200 - 249
と一致します1[0-9][0-9]
は100 - 199
と一致します[1-9][0-9]?
は1 - 99
と一致します0
は0
と一致します注:new RegExp
を使用する場合、\\.
の代わりに\.
を使用する必要があります。これは、文字列が2回エスケープされるためです。
function isValidIP(str) {
const octet = '(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]?|0)';
const regex = new RegExp(`^${octet}\\.${octet}\\.${octet}\\.${octet}$`);
return regex.test(str);
}
独自の正規表現を記述したり、貼り付けたりしないでください!おそらくすべてのEdge cses(IPv6、8進数のIPなど)はカバーしません。つかいます is-ip
npmから:
var isIp = require('is-ip');
isIp('192.168.0.1');
ブール値を返します。
Downvoters:Webサイトからコピーペーストするよりも、アクティブに管理されているライブラリを使用する方が優れている理由を説明してください。
IPアドレス形式の正規表現:
/^(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])\.(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])\.(\d\d?)|(1\d\d)|(0\d\d)|(2[0-4]\d)|(2[0-5])$/;
遅れて寄付する:
_^(?!\.)((^|\.)([1-9]?\d|1\d\d|2(5[0-5]|[0-4]\d))){4}$
_
私がチェックした回答のうち、それらは検証がより長いか不完全です。私の経験では、長くなると見落とすのが難しくなるため、間違いを起こしやすくなります。そして、同じ理由で、同様のパターンを繰り返すことは避けたいです。
主要な部分は、もちろん、0から255までの数値のテストですが、最初のゼロが許可されないことも確認します(単一の場合を除く)。
_[1-9]?\d|1\d\d|2(5[0-5]|[0-4]\d)
_
3つの代替-サブ100に1つ:_[1-9]?\d
_、100-199に1つ:_1\d\d
_、最後に200-255:2(5[0-5]|[0-4]\d)
。
この前に、行の開始またはドット_.
_のテスト、およびこの式全体は、追加された_{4}
_によって4回テストされます。
この4バイト表現の完全なテストは、_.
_:^(?!\.)
で始まり、行の終わりのテストで終了するアドレスを回避するために、行の先頭のテストに続いて負の先読みを行うことによって開始されます。 (_$
_)。
短い正規表現:^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$
例
const isValidIp = value => (/^(?:(?:^|\.)(?:2(?:5[0-5]|[0-4]\d)|1?\d?\d)){4}$/.test(value) ? true : false);
// valid
console.log("isValidIp('0.0.0.0') ? ", isValidIp('0.0.0.0'));
console.log("isValidIp('115.42.150.37') ? ", isValidIp('115.42.150.37'));
console.log("isValidIp('192.168.0.1') ? ", isValidIp('192.168.0.1'));
console.log("isValidIp('110.234.52.124' ? ", isValidIp('110.234.52.124'));
console.log("isValidIp('115.42.150.37') ? ", isValidIp('115.42.150.37'));
console.log("isValidIp('115.42.150.38') ? ", isValidIp('115.42.150.38'));
console.log("isValidIp('115.42.150.50') ? ", isValidIp('115.42.150.50'));
// Invalid
console.log("isValidIp('210.110') ? ", isValidIp('210.110'));
console.log("isValidIp('255') ? ", isValidIp('255'));
console.log("isValidIp('y.y.y.y' ? ", isValidIp('y.y.y.y'));
console.log(" isValidIp('255.0.0.y') ? ", isValidIp('255.0.0.y'));
console.log("isValidIp('666.10.10.20') ? ", isValidIp('666.10.10.20'));
console.log("isValidIp('4444.11.11.11') ? ", isValidIp('4444.11.11.11'));
console.log("isValidIp('33.3333.33.3') ? ", isValidIp('33.3333.33.3'));
そして代わりに
{1-3}
あなたは置くべきです
{1,3}
適切なコードを作成する場合、この非常に単純な正規表現/\d {1,3} /のみが必要です。
function isIP(ip) {
let arrIp = ip.split(".");
if (arrIp.length !== 4) return "Invalid IP";
let re = /\d{1,3}/;
for (let oct of arrIp) {
if (oct.match(re) === null) return "Invalid IP"
if (Number(oct) < 0 || Number(oct) > 255)
return "Invalid IP";
}
return "Valid IP";
}
しかし、実際には、正規表現をまったく使用しないことで、さらに簡単なコードを取得できます。
function isIp(ip) {
var arrIp = ip.split(".");
if (arrIp.length !== 4) return "Invalid IP";
for (let oct of arrIp) {
if ( isNaN(oct) || Number(oct) < 0 || Number(oct) > 255)
return "Invalid IP";
}
return "Valid IP";
}
Es6メソッドとしての私のバージョン、有効なIPに対してtrueを返し、そうでなければfalseを返します
isIP(ip) {
if (typeof(ip) !== 'string')
return false;
if (!ip.match(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/)) {
return false;
}
return ip.split('.').filter(octect => octect >= 0 && octect <= 255).length === 4;
}
常にバリエーションを探すことは、繰り返しの作業のように思えたので、forEach!
function checkIP(ip) {
//assume IP is valid to start, once false is found, always false
var test = true;
//uses forEach method to test each block of IPv4 address
ip.split('.').forEach(validateIP4);
if (!test)
alert("Invalid IP4 format\n"+ip)
else
alert("IP4 format correct\n"+ip);
function validateIP4(num, index, arr) {
//returns NaN if not an Int
item = parseInt(num, 10);
//test validates Int, 0-255 range and 4 bytes of address
// && test; at end required because this function called for each block
test = !isNaN(item) && !isNaN(num) && item >=0 && item < 256 && arr.length==4 && test;
}
}
それは多分良いです:
function checkIP(ip) {
var x = ip.split("."), x1, x2, x3, x4;
if (x.length == 4) {
x1 = parseInt(x[0], 10);
x2 = parseInt(x[1], 10);
x3 = parseInt(x[2], 10);
x4 = parseInt(x[3], 10);
if (isNaN(x1) || isNaN(x2) || isNaN(x3) || isNaN(x4)) {
return false;
}
if ((x1 >= 0 && x1 <= 255) && (x2 >= 0 && x2 <= 255) && (x3 >= 0 && x3 <= 255) && (x4 >= 0 && x4 <= 255)) {
return true;
}
}
return false;
}
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b
seachdataに無効なIPアドレスが含まれていないことがわかっている場合は、0.0.0.0〜999.999.999.999の使用に一致します。
\b(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]?)\b
iP番号と正確さを一致させるために使用します-4つの番号はそれぞれ独自のキャプチャグループに格納されるため、後でアクセスできます