-2

这是模式:

((?<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 行。我也需要它来匹配第一行。我在将第二行中的内容作为可选内容时遇到问题。如果我尝试将其设为可选,则最后两行也不匹配。我知道我在模式中没有任何内容与设备别名行匹配,但我试图首先将第二行中的输入作为可选输入。

4

3 回答 3

2

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

于 2012-09-06T14:51:07.260 回答
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
  }
}
于 2012-09-06T15:55:51.873 回答
0

很丑

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

这里工作

于 2012-09-06T14:58:00.220 回答