[英]Regular expression for IP Address Validation
我想驗證值是否有效 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 ..如何解決這個問題?
有一個更簡單的方法。 您只需要在.
並檢查每個數字是否都在 0 到 255 之間。
此外,您可以檢查 hexa 和 split on :
對於 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) 的正則表達式。
為 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>
這適用於所有可能的情況。
^(([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 中獲得了 function。
它處理從 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
我知道這是一個科學怪人正則表達式,但它仍然有效!
如果端口無關緊要,請使用以下端口:
/^(?:(?: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>
這是解決方案:
^(([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]))$
只是擴展@DavidFaber 的優秀解決方案。 要匹配 IPv4“點分十進制”表示法(無范圍/端口):
^(((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})$
我們希望模式正好重復四次 - 在這種情況下,我們的模式是 0-255 范圍內的數字,前面有一個句點.
或字符串的開頭,因為字符串的開頭只能出現一次。 其他三個事件必須是句號。
這個 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]))$
試圖縮短 Grealy 的版本
^((1?\d?\d|2[0-4]\d|25[0-5])($|\.(?!$))){4}$
注意:作為以前的版本,這不能正確處理八進制數,比如 0177.0.0.1
試試這個,
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]?)$"
您也可以檢查我給定的表達式,我已經檢查並在 java 中編寫了一個程序來驗證 ipv4 地址。 如果 Ipv4 地址正確則返回真,反之亦然。
字符串模式="^([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/>'); } });
您可以簡單地使用此正則表達式來驗證任何沒有端口號的 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]?)$/
也試試這個:
(((?<![\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 年歷史的問題,所以我懷疑您是否仍在尋找答案。
在另一個線程上發布了更多信息: Validating IPv4 addresses with regexp
對於模式 ex 192.168.23.28/255.255.255.0
^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)\/(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$
對於模式 ex 192.168.26.82/24 或 192.168.23.28/255.255.255.0
^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)\/([1-9]|1[0-9]|2[0-9]|3[0-2]|(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254))))$
對於模式 ex 192.168.26.28
^(25[0-5]|2[0-4][0-9]|[01]?[1-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-4]|2[0-4][0-9]|[01]?[1-9][0-9]?)$
對於 the.netmask ex 255.255.255.0
^(((128|192|224|240|248|252|254)\.0\.0\.0)|(255\.(0|128|192|224|240|248|252|254)\.0\.0)|(255\.255\.(0|128|192|224|240|248|252|254)\.0)|(255\.255\.255\.(0|128|192|224|240|248|252|254)))$
OP 要求驗證 IP 地址。 Q 的措辭幾乎肯定暗示 IPv4(與 IPv6 相反)。 我已經在 OP 上評論了有效性檢查可能達到的程度 go,並稱贊一位響應者采用非 RE 方法。 如果我在公共服務器上使用它,我也想(在某些情況下)測試地址的有效性,所以我想出了以下 JS:
function isSimpleIPv4( ip, u=true ) {
if ((ip === undefined) || (ip === null) || (ip.length > 15)) return false;
var p = ip.split(\'.\');
if (p.length != 4) return false;
p.forEach( function(v,k){p[k]=Number(v);} );
if (isNaN(p[0]) || isNaN(p[1]) || isNaN(p[2]) || isNaN(p[3]) ) return false;
if ((p[0] < 1) || (p[0] > 255) || (p[1] < 0) || (p[1] > 255) || (p[2] < 0) || (p[2] > 255) || (p[3] < 0) || (p[3] > 255)) return false;
if (!u) return true;
if ((p[0] > 223)) return 'multicast';
if ((p[0] == 127)) return 'loopback';
if ((p[0] == 10)) return 'RFC1918';
if ((p[0] == 192) && (p[1] == 168)) return 'RFC1918';
if ((p[0] == 172) && (p[1] >= 16) && (p[1] <= 31)) return 'RFC1918';
return true;
}
如果要檢查“有用”地址,則只需要字符串 IP,否則,如果只檢查 0-255.0-255.0-255.0-255,則使用 IP 字符串和 false 調用 function。 在前一種情況下,function 將返回 true/false/ 是有用的“失敗”原因。 網站訪問者想要的 RFC1918 地址無法從公共服務器訪問,甚至可能危及自己的服務器之一(環回范圍 127.xxx 中的地址可能)。 同樣,使用多播地址也無濟於事。 如果您對有用性檢查感興趣但不關心原因,那么您只需要執行if (isSimpleIPv4(ipString).== true) console;log('Not a valid and useful IP address');
IPv4 有 4 個數字塊,從 0 到 255,左邊可以包含填充零。 每個塊之間用一個點隔開。
簡短的 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 喜歡:
import { Component } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.scss'],
})
export class AppComponent {
ipranging="";
testForm1: FormGroup;
testForm2: FormGroup;
constructor(private fb: FormBuilder){
}
ngOnInit(): void {
const ipPattern =
"(?:(?: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]?)";
this.testForm1 = this.fb.group({
inp: ['', Validators.pattern(ipPattern)],
inp3: ['', Validators.pattern(ipPattern)]
});
this.testForm2 = this.fb.group({
inp: ['', Validators.pattern(ipPattern)],
inp2: ['', Validators.pattern(ipPattern)],
inp3: ['', Validators.pattern(ipPattern)]
});
this.testForm2.setValidators(this.comparisionValidator);
}
public comparisionValidator(group: FormGroup) : any{
const control1 = group.controls['inp'];
const control2 = group.controls['inp2'];
var control1array = control1.value.split('.');
var control2array = control2.value.split('.');
if(parseInt(control1array[0]) > parseInt(control2array[0]) ){
group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
console.log(group);
}
else if(parseInt(control1array[1]) > parseInt(control2array[1]) ){
group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
console.log(group);
}
else if(parseInt(control1array[2]) > parseInt(control2array[2]) ){
group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
console.log(group);
}
else if(parseInt(control1array[3]) > parseInt(control2array[3]) ){
group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': true });
console.log(group);
}
else {
group.controls['inp3'].setErrors({ 'value2GreaterThanValue1': false });
console.log(group);
}
}
}
<div style="text-align:left">
<h2>Choose if you want to enter a single ip or range of ip's</h2>
<select [(ngModel)]="ipranging">
<option selected disabled value="none"> -- select an option -- </option>
<option value='ip'>Single Ip address</option>
<option value="range">Ip range</option>
</select>
</div>
<form *ngIf="ipranging === 'ip'" novalidate [formGroup]="testForm1" class="render">
<label>IP Address:
<input formControlName="inp" placeholder='0.0.0.0'/></label>
<input formControlName="inp3" hidden/>
<!-- <p *ngIf="testForm.controls.inp.status == 'INVALID' && testForm.controls.inp.value != ''" >Invalid</p>
<p *ngIf="testForm.controls.inp2.status == 'INVALID' && testForm.controls.inp2.value != ''" >Invalid</p> -->
<p *ngIf="testForm1.controls.inp.value != '' && testForm1.controls.inp.status == 'INVALID'" >Invalid</p>
</form>
<form *ngIf="ipranging === 'range'" novalidate [formGroup]="testForm2" class="render">
<label>Starting IP:
<input formControlName="inp" placeholder='0.0.0.0'/></label>
<label>
Ending IP:
<input formControlName="inp2" placeholder='0.0.0.0'/></label>
<input formControlName="inp3" hidden/>
<!-- <p *ngIf="testForm.controls.inp.status == 'INVALID' && testForm.controls.inp.value != ''" >Invalid</p>
<p *ngIf="testForm.controls.inp2.status == 'INVALID' && testForm.controls.inp2.value != ''" >Invalid</p> -->
<p *ngIf="testForm2.controls.inp.value != '' && testForm2.controls.inp.status == 'INVALID' || testForm2.controls.inp2.value != '' && testForm2.controls.inp2.status == 'INVALID'" >Invalid</p>
<p *ngIf="testForm2.controls.inp3.errors.value2GreaterThanValue1 == true">Starting IP is larger than the ending IP</p>
</form>
這應該工作
^(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})\\.(\\d{1,3})$
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.