C# 正则表达式验证 Mac 地址。

5

我正在尝试验证MAC地址。在这种情况下,没有使用-:。例如,有效的MAC地址可能是以下之一:

0000000000
00-00-00-00-00-00
00:00:00:00:00:00

然而,当运行以下代码时,我一直得到false的结果:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Text.RegularExpressions;

namespace parsingxml
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Write("Give me a mac address: ");

            string input = Console.ReadLine();
            input = input.Replace(" ", "").Replace(":","").Replace("-","");

            Regex r = new Regex("^([:xdigit:]){12}$");


            if (r.IsMatch(input))
            {
                Console.Write("Valid Mac");
            }
            else
            {
                Console.Write("Invalid Mac");
            }
            Console.Read();
        }
    }
}

输出:无效的 Mac 地址


2
“[:xdigit:]”是什么意思? - TGlatzer
1
不是在.NET中。 - qJake
如果我输入我的正则表达式字符串,你的代码对我有效。 - qJake
我的示例代码太长了,我已经在 MSDN 上发布了它:https://social.msdn.microsoft.com/Forums/en-US/a6f8b4ca-f0d3-4597-9dea-ebf7e73c5ce4/mac-address-validation - Nolmë Informatique
7个回答

10
.NET正则表达式不支持POSIX字符类。即使它支持,你也需要用[]括起来才能生效,例如[[:xdigit:]],否则它将被视为一个包含字符:xdigt的字符类。

在清除掉不需要的字符后,你可能需要使用以下正则表达式来匹配MAC地址:

^[a-fA-F0-9]{12}$

请注意,通过清除字符串中的空格、-:,您将允许如下所示的输入通过:
   34:   3-342-9fbc: 6:7

演示


不会匹配“12-23-34-45-56-67”或“12:23:34:45:56:67”,这些都是根据提问者的要求有效的。 - qJake
1
@SpikeX:看代码 - OP已经清理了字符“:”和“-”。因此它们将匹配。 - nhahtdh
也许 OP 只是清理了字符,因为他认为这是验证的唯一方法。@ZacBorders 如果您的输入确实只包含字母和数字(没有 :-),那么这肯定适用于您:^[a-fA-F0-9]{12}$。如果不行,那么您可能做错了其他事情,应该调试程序找出问题所在。 - qJake
1
@ZacBorders:请查看演示。 - nhahtdh
@SpikeX 当使用或不使用 - 或 : 进行调试时,输入显示正确,例如当传递给 r.ismatch 时为 000000000000。 - Zac Borders
显示剩余2条评论

5
请尝试使用以下正则表达式替换原来的表达式: ^(?:[0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}|(?:[0-9a-fA-F]{2}-){5}[0-9a-fA-F]{2}|(?:[0-9a-fA-F]{2}){5}[0-9a-fA-F]{2}$ 匹配以下格式的字符串:
- 12-23-34-45-56-67 - 12:23:34:45:56:67 - 122334455667
但不匹配以下格式的字符串:
- 12:34-4556-67
请注意,此代码对我有效。

2
我不怀疑那个方法可以运行,但我更好奇的是为什么我的实现失败了,理论上它甚至可以匹配12:34-4556-67,我不想因为用户输入MAC地址时打字不准而被卡住。 - Zac Borders
你应该只接受符合IEEE MAC-48标准格式的有效MAC地址:http://en.wikipedia.org/wiki/MAC_Address 。因此,12:23-3445-56:67无效 的。 - qJake
@ZacBorders:问题在于你写的正则表达式不被.NET正则表达式支持。不过,你的思路是正确的。 - nhahtdh
1
@SpikeX:我认为清理(重新格式化)输入,向用户展示并验证它是公平的。 - nhahtdh
@SpikeX 我同意你的观点,如果只是需要剥离字符以搜索文件名中带有Mac地址的文件,那么这个方法确实很有用。非常感谢。 - Zac Borders

1
        using System.Net.NetworkInformation;
        try{
            PhysicalAddress py = PhysicalAddress.Parse("abcd");
        }catch(Exception){
            Console.WriteLine("Mac address not valid");
        }

3
代码回答可能会解决问题,但您可以通过为代码提供上下文、解释其工作原理的原因以及参考一些文档来显著提高答案的质量。简短可行,但更详细的解释会更好。 - Pranav Hosangadi
1
问题是关于正则表达式解决方案的。 - marsh-wiggle

1
似乎你可以这样做:

Seems like you could just do this:

Regex r = new Regex("^([0-9a-fA-F]{2}(?:(?:-[0-9a-fA-F]{2}){5}|(?::[0-9a-fA-F]{2}){5}|[0-9a-fA-F]{10}))$");

或者使用这个更简单的方法,会更加容易理解:
Regex r = new Regex("^([0-9a-fA-F]{2}(?:[:-]?[0-9a-fA-F]{2}){5})$");

这不匹配任何一个 12233445566712-23-34-45-56-67 或者 12:23:34:45:56:67。http://gskinner.com/RegExr/ - qJake
现在你的正则表达式甚至都不合法了,你有一个未匹配的括号。 - qJake
1
@SpikeX 我花了一点时间才能测试它。现在应该已经修复了。 - p.s.w.g

0
我会使用类似于这样的正则表达式:
Regex rxMacAddress = new Regex( @"^[0-9a-fA-F]{2}(((:[0-9a-fA-F]{2}){5})|((:[0-9a-fA-F]{2}){5}))$") ;

6对十六进制数字,分隔符可以是冒号或连字符,但不能混用。


感谢分享。不过我认为有一个小错误:第二个:应该改成-。 - ocroquette

0

以下是我使用的正确正则表达式,可以接受带有所有 - 或所有 : 分隔符的任何 MAC 地址: "^[0-9a-fA-F]{2}(((:[0-9a-fA-F]{2}){5})|((-[0-9a-fA-F]{2}){5}))$"


0

你的正则表达式不太好。这里有一个好的:

public const string ValidatorInvalidMacAddress = "^([0-9A-Fa-f]{2}[:-]?){5}([0-9A-Fa-f]{2})$";

仅仅发布正则表达式并不能帮助Zac了解为什么他的正则表达式需要改进。答案应该改进,解释为什么他的正则表达式需要改进,并让读者了解所提议的正则表达式正在做什么。 - Justin Pearce

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接