这是模式:
((?<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行匹配。我还需要它来匹配第一行。我遇到的问题是将第二行中的内容作为可选项。如果我尝试将其设为可选项,则最后两行也不匹配。我知道模式中没有任何东西可以匹配设备别名行,但我试图将第二行中的输入作为可选的第一行。
答案 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
}
}