首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MAC地址重格式中的额外分隔符

MAC地址重格式中的额外分隔符
EN

Stack Overflow用户
提问于 2014-05-20 15:50:23
回答 2查看 324关注 0票数 0

我在这里看过几个关于格式化和验证MAC地址的问题,这就是我开发regex的地方。我遇到的问题是,当我更新字段时,新格式化的MAC中有额外的分隔符,或者如果不存在分隔符,MAC就无法验证。我刚开始使用regex,所以有人能解释一下为什么会发生这种情况吗?

代码语言:javascript
复制
if (checkMac(NewMacAddress.Text) == true)
{
    string formattedMAC = NewMacAddress.Text;
    formattedMAC.Replace(" ", "").Replace(":", "").Replace("-", ""); //attempt to remove the delimiters before formatting
    var regex = "(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})";
    var replace = "$1:$2:$3:$4:$5:$6";
    var newformat = Regex.Replace(formattedMAC, regex, replace);
    NewMacAddress.Text = newformat.ToString();
}

下面是checkmac函数

代码语言:javascript
复制
protected bool checkMac(string macaddress)
    {
        macaddress.Replace(" ", "").Replace(":", "").Replace("-", "");
        Regex r = new Regex("^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$");

        if (r.Match(macaddress).Success)
        {
            return true;
        }
        else
        {
            return false;
        }

    }

这是我刚才提到的额外分隔符的示例输出。00:5:0::56:B:F:00:7F我能够从文本框中获得原始MAC。这也发生在我从屏幕擦拭得到的MAC地址。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-20 21:26:00

您的代码不按预期工作的原因是:

  1. String.Replace不修改传入的字符串,而是返回一个新字符串(字符串是不可变的)。您必须将String.Replace的结果赋给一个变量。
  2. 您的checkMac函数只允许带有分隔符的mac地址。您可以简单地删除此限制以解决您的问题。

然后,工作代码变成了类似于以下内容的内容:

代码语言:javascript
复制
string newMacAddress = "00::5:0::56::b:f:00:7f";
if (checkMac(newMacAddress) == true)
{
    string formattedMAC = newMacAddress;
    formattedMAC = formattedMAC.Replace(" ", "").Replace(":", "").Replace("-", ""); //attempt to remove the delimiters before formatting
    var regex = "(.{2})(.{2})(.{2})(.{2})(.{2})(.{2})";
    var replace = "$1:$2:$3:$4:$5:$6";
    var newformat = Regex.Replace(formattedMAC, regex, replace);
    newMacAddress = newformat.ToString();
}

protected static bool checkMac(string macaddress)
{
    macaddress = macaddress.Replace(" ", "").Replace(":", "").Replace("-", "");
    Regex r = new Regex("^([0-9A-Fa-f]{12})$");

    if (r.Match(macaddress).Success)
    {
        return true;
    }
    else
    {
        return false;
    }
}
票数 1
EN

Stack Overflow用户

发布于 2014-05-20 21:05:34

你离我很近。我首先要回答的是使用Ruby,因为这是我目前最熟悉的,而且应该足够让您了解如何让它在C#中工作。也许我可以稍后把它转换成C#。

利用这些要素:

  • \A -整个字符串的开始
  • [0-9a-fA-F] -任何十六进制数字
  • {2} -两次
  • [:-]? - ":“或"-”或"“(没有分隔符)
  • \Z -整个字符串的结尾,如果它存在,在结束换行符之前
  • () -用于引用正则表达式的部分的括号匹配,例如match[1]

这个正则表达式可以满足您的需要:

代码语言:javascript
复制
mac_address_regex = /\A([0-9a-fA-F]{2})[:-]?([0-9a-fA-F]{2})[:-]?([0-9a-fA-F]{2})[:-]?([0-9a-fA-F]{2})[:-]?([0-9a-fA-F]{2})[:-]?([0-9a-fA-F]{2})\Z/

您可以使用此正则表达式验证和清理输入:

代码语言:javascript
复制
match = mac_address_regex.match(new_mac_address.text)
if match.present?
  sanitized_mac_addr = (1..6).map { |i| match[i] }.join(":") # join match[i] for i = (1,2,3,4,5,6)
  sanitized_mac_addr.upcase!                                 # uppercase
else
  sanitized_mac_addr = nil
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23764564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档