2017-07-14 8 views
1

私のようなテキストから2グループをキャプチャする方法、を把握しようとしている:私は「MyV​​alue」をキャプチャしたいオプションの前に終わりのための正規表現「 - 」または sの

---MyValue=4497-DD616-1134-34---\r\n 

と"4497-DD616-1134-34"。 \ s文字(\ r、\ n、空白など)を除く任意の文字と、 ' - '文字を繰り返し使用できます。一度に2回。 私の現在の正規表現:

(?<Attribute>[^-\s\r\n]+)=(?<Value>[^-\s\r\n]+) 

それに伴う問題は、全体の「4497-DD616-1134-34」の値から、それは最初の前にのみアルファ文字をキャプチャすること、である「 - 」サインが。文字列の終わり近くにある " - "の前に全体の値を取得する必要があります。 また、この正規表現は、文字列などのために働く必要があります。

MyValue=17% 
Number=72 

をので、 "---"、 "\ R"、 "\ n" は、文字などはオプションです。 私はRegexをC#で使っています。正規表現に Example, of what is actually captured

リンク:Regex link

任意のアイデア?

あなたは、このように正規表現を使用することができ
+0

は、あなたの表現が実際にキャプチャするものの例を表示します。 –

+1

'(\ w +)=(\ w + - \ w + - \ w + - \ w +)'?キャプチャグループ1: 'MyValue'、キャプチャグループ2:' 4497-DD616-1134-34' – Fabien

+0

どの言語を使用していますか?正規表現は異なるフレーバーで来る –

答えて

4

:、エンディング---はオプションであり、また、あなたがあまりにもリテラル\r\nなどのオプションを持っている場合、一方

(\w+)=(.*?)(?:\s|--) 

Working demo

あなたはこの正規表現を使用することができます:

(\w+)=(.*?)(?:\s|--|\\r|\\n) 

Working demo

2

使用は

(?<Attribute>\w+)=(?<Value>(?:(?!-{3})\S)+) 

あなたのような、より詳細な正規表現を考慮することができる.NET regex demo

を参照するか、値のみをハイフンで構成されている場合、必要に応じて%で終わる単語文字列を分離:

(?<Attribute>\w+)=(?<Value>\w+(?:-\w+)*%?) 

another demo

enter image description here

詳細

  • (?<Attribute>\w+) - "属性" グループ:1以上の単語文字
  • =から=シンボル
  • (?<Value>(?:(?!-{3})\S)+) - "バリュー" のグループ:を開始していない非空白文字(\S)と一致します。文字シーケンス、1回以上。
    OR
  • \w+ - 1以上の単語文字
  • (?:-\w+)* - 任意%シンボル - -と1+単語文字
  • %?のゼロ以上の配列。

C# demo

var pat = @"(?<Attribute>\w+)=(?<Value>(?:(?!-{3})\S)+)"; 
var s = "---MyValue=4497-DD616-1134-34---\r\n---MyNum=72 MyPercent=17% --- "; 
var res = Regex.Matches(s, pat) 
    .Cast<Match>() 
    .ToDictionary(
     m => m.Groups["Attribute"].Value, 
     m => m.Groups["Value"].Value 
    ); 
foreach (var kvp in res) 
{ 
    Console.WriteLine("[{0}, {1}]", kvp.Key, kvp.Value); 
} 

出力:

[MyValue, 4497-DD616-1134-34] 
[MyNum, 72] 
[MyPercent, 17%] 
関連する問題