2017-11-29 4 views
-1

私は次の正規表現を使用して解析しようとしています。グループには一連の値が含まれ、常に新しい行で区切られます。しかし、すべての値が常に存在するわけではなく、順序は必ずしも同じではありません。無効な値のグループに一致する正規表現を作成する

abc = 111 
def = 122 
ijk = 133 

def = 222 
abc = 211 
ijk = 233 

abc = 311 
ijk = 333 

は、ここで私がこれまで持っているものだが、すべての値が存在し、正しい順序

(?:abc = (?<abc>\d*))\n(?:def = (?<def>\d*))\n(?:ijk = (?<ijk>\d*)) 

に、私は様々な可能発注用のアカウントに|の束を追加することができた場合にのみ動作しますが、しかし、それは巨大な混乱を招き、表現をほとんど読みにくくします。

+1

どのようなプログラミング言語をお使いですか? – Jan

+0

あなたのグループに名前を付けて、その名前にキャプチャグループ1にアクセスするのではなく、['([a-z] +)=(\ d +)'](https://regex101.com/r/QCrbYr/1)を使うのはなぜですか? – ctwheels

+0

@Jan、私はc# – PBG

答えて

0

あなたは、任意の順序で単一のグループにマッチするパターンを必要とし、各グループを抽出するためにRegex.Matchesを使用します。

var pattern = @"(?:(?:(?:abc = (?<abc>\d+))|(?:def = (?<def>\d+))|(?:ijk = (?<ijk>\d+)))\r\n)+"; 

var ans = Regex.Matches(src, pattern, RegexOptions.Multiline) 
       .Cast<Match>() 
       .Select(mg => mg.Groups.Cast<Group>().Skip(1).Select(g => new { g.Name, g.Value }).ToDictionary(g => g.Name, g => g.Value)); 

が、私は、グループごとに Dictionaryまでキャプチャを減らすためにLINQを使用していました。グループ全体の辞書エントリ(キー 0)が必要な場合は、 Skip(1)を省略することができます。

関連する問題