我在这里看过几个关于格式化和验证MAC地址的问题,这就是我开发regex的地方。我遇到的问题是,当我更新字段时,新格式化的MAC中有额外的分隔符,或者如果不存在分隔符,MAC就无法验证。我刚开始使用regex,所以有人能解释一下为什么会发生这种情况吗?
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:B:F:00:7F我能够从文本框中获得原始MAC。这也发生在我从屏幕擦拭得到的MAC地址。
发布于 2014-05-20 21:26:00
您的代码不按预期工作的原因是:
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;
}
}发布于 2014-05-20 21:05:34
你离我很近。我首先要回答的是使用Ruby,因为这是我目前最熟悉的,而且应该足够让您了解如何让它在C#中工作。也许我可以稍后把它转换成C#。
利用这些要素:
\A -整个字符串的开始[0-9a-fA-F] -任何十六进制数字{2} -两次[:-]? - ":“或"-”或"“(没有分隔符)\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/您可以使用此正则表达式验证和清理输入:
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
endhttps://stackoverflow.com/questions/23764564
复制相似问题