使用正则表达式进行 IPv4 验证

Posted

技术标签:

【中文标题】使用正则表达式进行 IPv4 验证【英文标题】:IPv4 validation using regex 【发布时间】:2014-12-25 02:24:26 【问题描述】:

我正在尝试通过不显眼的验证来验证我的表单中的 IPv4 地址。所有其他验证都可以正常工作,但这个可以正常工作。

我这样定义属性模型:

[RegularExpression(ipAdressRegEx, ErrorMessageResourceName = "IPInvalid", ErrorMessageResourceType = typeof(Strings))]
public virtual String IP  get; set; 

还有我的正则表达式:

private const string ipAdressRegEx = @"/\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/g";

生成的html是这样的:

    <input class="k-textbox" data-val="true" data-val-regex="Invalid IP" 
data-val-regex-pattern="/\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/g" 
id="IP" name="IP" type="text" value="">
<span class="field-validation-valid" data-valmsg-for="IP" data-valmsg-replace="true"></span>

但验证显示错误无效 IP 错误消息,例如到 ip="192.168.1.1"。

如果我在浏览器控制台中输入以下内容:

"192.168.1.1".match(/\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/g)

(使用传递给输入验证的模式)它返回IP,这是正确的。

我不明白为什么在这种情况下不显眼的验证不起作用...

我尝试了不同的模式...

【问题讨论】:

我的猜测是问题出在 /g 修饰符上,我相信这是 javascript 特有的。可能是 ASP.NET MVC 验证使用其他方法在客户端进行匹配,而不是您正在测试的 match 方法。在服务器端,这个修饰符肯定不支持 【参考方案1】:

松开您在字符串中指定的斜杠和g 选项。这些是正则表达式的 JavaScript 分隔符。通过 API 传递正则表达式时不需要。

data-val-regex-pattern="\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" 

【讨论】:

【参考方案2】:

你可以创建类似的方法,

private boolean checkIp(String ipValue,String regex)
   return ipValue.matches(regex);


checkIp(yourIpValue, "^([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])$")

【讨论】:

【参考方案3】:

我只是在想,生成的不显眼验证的时髦 html 可能会对客户端和服务器上正则表达式的行为产生一些问题。这是解释并提供一些解决方法的文章

http://blogs.msdn.com/b/tilovell/archive/2013/05/08/regular-expressions-are-different-in-javascript-and-unintrusive-validation.aspx

【讨论】:

【参考方案4】:

关注这个

$("#adressIP, #GatewayInp, #SubnetMask").keyup(function() 
   var input = $(this).val();
   console.log(input);
   var regex = new RegExp('(([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])$');
   if (regex.test(input)) 
    console.log("match");
    else 
    console.log("nomatch");
   
);

【讨论】:

或许可以添加一些解释?【参考方案5】:
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)  
 

【讨论】:

以上是关于使用正则表达式进行 IPv4 验证的主要内容,如果未能解决你的问题,请参考以下文章

(替代解决方案)使用正则表达式使用通配符 (*) 验证 IPV4 和 IPV6

用于验证 IPv4 和 IPv6 地址的 Javascript 正则表达式,没有主机名

前端表单验证常用的15个JS正则表达式

最常用的15个前端表单验证JS正则表达式

前端表单验证常用的15个JS正则表达式

验证IP地址——正则表达式详解