-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行になります。

 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行目に一致しています。最初の行にも一致する必要があります。2行目にあるものをオプションとして取得する際に問題が発生します。オプションにしようとすると、最後の2行も一致しません。デバイスエイリアス行に一致するパターンにはまだ何もありませんが、最初にオプションとして2行目の入力を取得しようとしています。

4

3 に答える 3

2

pwwn正規表現では情報が存在する必要があるため、最初の行と一致しません。

于 2012-09-06T14:51:07.260 に答える
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 に答える
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 に答える