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地址上。
你的代码没有按预期工作的原因是:
- 字符串。Replace不会修改传入的字符串,而是返回一个新字符串(字符串是不可变的)。你必须将
String.Replace
的结果赋值给一个变量。 - 你的
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