我希望有一个正则表达式来验证以下MAC地址格式。
01-23-45-67-89-ab
或01-23-45-67-89-AB
01:23:45:67:89:ab
或01:23:45:67:89:AB
0123.4567.89ab
或0123.4567.89AB
0123456789ab
或0123456789AB
以上所有都是有效的MAC地址格式。
MAC地址应包含来自[a-f A-F]
集的所有大写字母或所有小写字母(但不是两个)的英文字母。
目前我正在使用6 regex
模式,我已使用or
将它们组合在一起进行验证,这看起来并不好。
这是我的Javascript代码:
var value='01-23-45-67-89-ab';
var regex = new RegExp("^([0-9a-f]{2}){6}$");
var regex1 = new RegExp("^([0-9A-F]{2}){6}$");
var regex2 = new RegExp("^([0-9A-F]{2}[:-]){5}([0-9A-F]{2})$");
var regex3 = new RegExp("^([0-9a-f]{2}[:-]){5}([0-9a-f]{2})$");
var regex4 = new RegExp("^([0-9a-f]{4}[\\.]){2}[0-9a-f]{4}$");
var regex5 = new RegExp("^([0-9A-F]{4}[\\.]){2}[0-9A-F]{4}$");
if (regex.test(value) || regex1.test(value)|| regex2.test(value)|| regex3.test(value)|| regex4.test(value)|| regex5.test(value)){
return true;
}
else{
return false;
}
在不使用or
的情况下,将它们组合起来是更好的方法吗?
我对regex
不满意。
任何帮助将不胜感激。
答案 0 :(得分:4)
是的,这些正则表达式可以简化,然后组合成一个正则表达式来匹配所有这些情况。
这是他们的组合:
^([0-9A-F]{12}|(?:[0-9A-F]{2}:){5}[0-9A-F]{2}|(?:[0-9A-F]{2}-){5}[0-9A-F]{2}|(?:[0-9A-F]{4}\.){2}[0-9A-F]{4})$
请注意,您不必复制正则表达式以考虑大写和大写两种情况,并且您可以指定"i"
作为new RegExp()
的第二个参数来指定它应该匹配不区分大小写。
var regex = new RegExp("^([0-9A-F]{12}|(?:[0-9A-F]{2}:){5}[0-9A-F]{2}|(?:[0-9A-F]{2}-){5}[0-9A-F]{2}|(?:[0-9A-F]{4}\.){2}[0-9A-F]{4})$", "i");
if( regex.test( value ) )
{
//true
}
根据对此答案的评论的要求,这里是一个不允许案例混合的版本......
^([0-9A-F]{12}|[0-9a-f]{12}|(?:[0-9A-F]{2}:){5}[0-9A-F]{2}|(?:[0-9a-f]{2}:){5}[0-9a-f]{2}|(?:[0-9A-F]{2}-){5}[0-9A-F]{2}|(?:[0-9a-f]{2}-){5}[0-9a-f]{2}|(?:[0-9A-F]{4}\.){2}[0-9A-F]{4}|(?:[0-9a-f]{4}\.){2}[0-9a-f]{4})$
答案 1 :(得分:2)
MAC地址没有不同的格式,只能以不同的方式呈现。 MAC地址是一个12个字符长的十六进制字符串。
你应该改变方法。不是接受各种格式并将用户输入与几个正则表达式匹配,而是转换用户输入并将其与一个正则表达式匹配。