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

本文关键字:分隔符 格式化 地址 MAC | 更新日期: 2023-09-27 18:04:11

我在这里看了几个关于格式化和验证MAC地址的问题,这就是我开发正则表达式的地方。我遇到的问题是,当我去更新字段时,新格式化的MAC中有额外的分隔符,或者如果没有分隔符存在,则MAC无法验证。我是使用正则表达式的新手,所以有人能澄清为什么会发生这种情况吗?

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函数

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:: f: 00:7f我能够从一个文本框中得到原始MAC。这也发生在我从屏幕刮擦中获得的MAC地址上。

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

你的代码没有按预期工作的原因是:

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

工作代码就变成了下面这些行:

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;
    }
}

你很接近了。我将首先使用Ruby来回答这个问题,因为这是我目前最熟悉的语言,并且它应该足以让您理解如何在c#中使用它。也许我以后可以把它转换成c#。

使用这些元素:

  • 'A -整个字符串的开始
  • [0-9a-fA-F] -任意十六进制数字
  • {2} - twice
  • [:-]? -":"或"-"或"(无分隔符)
  • 'Z -在换行符之前结束整个字符串
  • () -括号匹配,以便引用正则表达式的部分,例如match[1]

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

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/

您可以使用以下regex来验证和清理输入:

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