将不同的正则表达式合并为一个以验证不同的MAC地址格式

时间:2014-05-06 14:23:52

标签: regex

我希望有一个正则表达式来验证以下MAC地址格式。

  1. 01-23-45-67-89-ab01-23-45-67-89-AB
  2. 01:23:45:67:89:ab01:23:45:67:89:AB
  3. 0123.4567.89ab0123.4567.89AB
  4. 0123456789ab0123456789AB
  5. 以上所有都是有效的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不满意。 任何帮助将不胜感激。

2 个答案:

答案 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})$

Regular expression visualization

请注意,您不必复制正则表达式以考虑大写和大写两种情况,并且您可以指定"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个字符长的十六进制字符串。

你应该改变方法。不是接受各种格式并将用户输入与几个正则表达式匹配,而是转换用户输入并将其与一个正则表达式匹配。

  • 接受用户输入
  • 删除冒号(:)
  • 删除破折号( - )
  • 删除空格()
  • 转换为全部大写
  • 验证