RegEx模式匹配

时间:2012-09-06 14:26:40

标签: c# regex

这是模式:

((?<active>\*\s)*(fcid\s(?<fcid>0x[0-9a-f]{6})\s)*\[)?pwwn\s(?<pwwn>(([0-9a-f]{2}:){7})[0-9a-f]{2})(]\s\[(?<alias>\w*))*

这是可能的输入 - 每个输入都是一行:

 1/ *fcid 0xce36c3 [device-alias N2F07D08]
 2/ pwwn c0:50:76:04:52:7e:00:2b [ARAH2KDBP04_STA_2b]
 3/ *fcid 0x19176a  [pwwn c0:50:76:04:52:7e:00:2a] [ARAH2KDBP04_STA_2]

它目前与第2行和第3行匹配。我还需要它来匹配第一行。我遇到的问题是将第二行中的内容作为可选项。如果我尝试将其设为可选项,则最后两行也不匹配。我知道模式中没有任何东西可以匹配设备别名行,但我试图将第二行中的输入作为可选的第一行。

3 个答案:

答案 0 :(得分:2)

它与第一行不匹配,因为正则表达式需要pwwn信息存在。

答案 1 :(得分:0)

这是丑陋

((\*\s*)?fcid\s*0x\w{6}\s*\[(device-alias.*?|pwwn\s\w{2}(\:\w{2}){7})\]|pwwn\s\w{2}(\:\w{2}){7})

工作here

答案 2 :(得分:0)

在选中IgnoreCase和MultiLine选项以及命名组的情况下尝试此正则表达式:

^(?<active>\*\s?)*(?:fcid\s(?<fcid>0x[0-9a-f]{6})\s+)?(?:\[?pwwn\s(?<pwwn>(?:[0-9a-f]{2}:){7}[0-9a-f]{2})\]?\s+)?\[(?<alias>[^[]+)\]$

您可以在此处RegexHero

进行测试

C#代码可以是:

string strRegex = @"^(?<active>\*\s?)*(?:fcid\s(?<fcid>0x[0-9a-f]{6})\s+)?(?:\[?pwwn\s(?<pwwn>(?:[0-9a-f]{2}:){7}[0-9a-f]{2})\]?\s+)?\[(?<alias>[^[]+)\]$";
RegexOptions myRegexOptions = RegexOptions.IgnoreCase | RegexOptions.Multiline;
Regex myRegex = new Regex(strRegex, myRegexOptions);
string strTargetString = @"*fcid 0xce36c3 [device-alias N2F07D08]\npwwn c0:50:76:04:52:7e:00:2b [ARAH2KDBP04_STA_2b]\n*fcid 0x19176a  [pwwn c0:50:76:04:52:7e:00:2a] [ARAH2KDBP04_STA_2]";

foreach (Match myMatch in myRegex.Matches(strTargetString))
{
  if (myMatch.Success)
  {
    // Extract your named groups here
  }
}