正则表达式 - 捕获 Mac;强制执行匹配长度 & 删除中间匹配项



我正试图编写一个正则表达式来捕获MAC,但我是通过人工输入来实现的,他们可以通过各种方式输入值。为此,我只想在没有分隔符的情况下捕获实际值(如AABBCCDDEEFF(,然后自己插入分隔符。

目前我的正则表达式是:

([0-9A-F]{2,12}(?:[:.,]?)(?: ?)){1,5}([0-9A-F]{2,4})(?:$| )

给定样本:

AABBCCDD11AA
AABB.CCDD.11AA
AB.BB.CC.DD.11.AA
AA.BB.CC.DD.11:AA   uselessText
UselessText AA.BB.CC.DD.11.AA   
MoreText:AA,BB:CC.DD.11.AA
AA. BB. CC. DD. 11. AA
AA, BB, CC, DD, 11, AA   uselessText
UselessText.:AA:BB:CC:DD: 11: AA
MoreText:00.AA.BB.CC.DD.11.AA
Text00.00.00.00.00.00
ABAB 
There's nothing to match on this line
01010101010 textUslessText

它确实会拾取MAC,但也会拾取无效值,包括"ABAB"one_answers"01010101010"。此外,它似乎仍在选择:。和/或,对于值分隔符,它会拾取终止的空白,尽管有(?:$|(。

所以我的问题实际上有三个部分:

  1. 如何强制执行X个字符的最终匹配
  2. 为什么这仍然在选择(?:…(中的字符
  3. 为什么要选择终止空白

我从来没有对雷格斯感到舒服,所以这可能是我忽视的一件显而易见的事情。

一个混乱的问题可能需要一个不雅的,或者至少是重复的正则表达式。如果表达式([0-9A-F]{2})与MAC地址的一个字节匹配,而(?:[:., ]*)与包括空格在内的允许分隔符匹配,则MAC地址的完全展开正则表达式为

([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})

这将产生包括分隔符以及MAC地址的每个字节的捕获组1到6的匹配。格式化的MAC地址可以由捕获组和规范分隔符组成。

处理数据的C#示例代码如下所示:

List<string> vectors = new List<string>();
vectors.Add("AABBCCDD11AA");
vectors.Add("AABB.CCDD.11AA");
vectors.Add("AB.BB.CC.DD.11.AA");
vectors.Add("AA.BB.CC.DD.11:AA   uselessText");
vectors.Add("UselessText AA.BB.CC.DD.11.AA   ");
vectors.Add("MoreText:AA,BB:CC.DD.11.AA");
vectors.Add("AA. BB. CC. DD. 11. AA");
vectors.Add("AA, BB, CC, DD, 11, AA   uselessText");
vectors.Add("UselessText.:AA:BB:CC:DD: 11: AA");
vectors.Add("MoreText:00.AA.BB.CC.DD.11.AA");
vectors.Add("Text00.00.00.00.00.00");
vectors.Add("ABAB ");
vectors.Add("There's nothing to match on this line");
vectors.Add("01010101010 textUslessText");
snippetResult.Clear();
Regex regex = new Regex("([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})(?:[:., ]*)([0-9A-F]{2})");
foreach (string vector in vectors)
{
    Match match = regex.Match(vector);
    if (match.Success)
    {
        string mac
            = match.Groups[1].Value + ":"
            + match.Groups[2].Value + ":"
            + match.Groups[3].Value + ":"
            + match.Groups[4].Value + ":"
            + match.Groups[5].Value + ":"
            + match.Groups[6].Value;
        snippetResult.Text += "Match '";
        snippetResult.Text += match.Groups[0].Value;
        snippetResult.Text += "' ==> ";
        snippetResult.Text += mac;
        snippetResult.Text += Environment.NewLine;
    }
}

使用测试向量的输出是:

Match 'AABBCCDD11AA' ==> AA:BB:CC:DD:11:AA
Match 'AABB.CCDD.11AA' ==> AA:BB:CC:DD:11:AA
Match 'AB.BB.CC.DD.11.AA' ==> AB:BB:CC:DD:11:AA
Match 'AA.BB.CC.DD.11:AA' ==> AA:BB:CC:DD:11:AA
Match 'AA.BB.CC.DD.11.AA' ==> AA:BB:CC:DD:11:AA
Match 'AA,BB:CC.DD.11.AA' ==> AA:BB:CC:DD:11:AA
Match 'AA. BB. CC. DD. 11. AA' ==> AA:BB:CC:DD:11:AA
Match 'AA, BB, CC, DD, 11, AA' ==> AA:BB:CC:DD:11:AA
Match 'AA:BB:CC:DD: 11: AA' ==> AA:BB:CC:DD:11:AA
Match '00.AA.BB.CC.DD.11' ==> 00:AA:BB:CC:DD:11
Match '00.00.00.00.00.00' ==> 00:00:00:00:00:00

最新更新