2017-11-07 16 views
0

を変化させる正規表現を使って文字列を解析します。は、区切り文字は私が解析する必要が以下の文字列を持っている

私は次の正規表現まで行っています。

<!-- *(?<mode>.*?(?=[ \-:])).*: *(?<responses>.*?(?= *-->)) 

これは、最初の2つを除く上記のテスト文字列すべてに対して機能します。最初の2つのケースでは、「モード」グループが空に戻ってきます。私は、?<mode>.*?(?=[ \-:])がスペース、ダッシュ、またはコロンになるまですべての文字を収集すると考えていたため、わかりません。途中で.*: *.*:? *に変更すると、すべての「モード」値が取得されますが、すべての「応答」値が失われます。

私のテストコードは.NET Fiddle(https://dotnetfiddle.net/HzIXch)ですが、ここでは完全です。

var regex = new Regex(@"<!-- *(?<mode>.*?(?=[ \-:])).*: *(?<responses>.*?(?= *-->))"); 
var values = new[] { 
    "<!-- MOCK -->", 
    "<!--MOCK-->", 
    "<!-- MOCK:SENT;FAIL -->", 
    "<!--MOCK:SENT;SUCCESS-->", 
    "<!--MOCK:SENT; SUCCESS-->", 
    "<!--MOCK:SENT ; SUCCESS-->", 
    "<!--MOCK:SENT -->", 
    "<!-- MOCK:SENT-->", 
    "<!-- MOCK : SENT -->", 
    "<!-- MOCK: SENT -->", 
    "<!-- MOCK :SENT -->", 
}; 
foreach (var value in values) 
{ 
    var match = regex.Match(value); 
    Console.WriteLine($"Mode: [{match.Groups["mode"].Value}], Responses: [{match.Groups["responses"].Value}]"); 
} 
+0

スペースを作成してください: '\ s *'。アスタリスクは0回以上の出現です。 – jdweng

+0

あなたの "モード"と "応答"グループは常に大文字で構成されますか、それとも他の文字を含むことができますか? – CAustin

答えて

1

ここで先読みを使用する必要はありません。これは私がそれを行うだろうかです:投稿された他の回答、そしてあなたの質問にコメントについて

(?<mode>[A-Z]+)([ \-:]+(?<responses>[A-Z; ]+\b))?

https://dotnetfiddle.net/6xpkt1

、私は完全に同意します。 \sはリテラルスペースと同じではありません。 すべての空白文字が含まれています。スペースが必要な場合に問題が発生する可能性があります。

+0

私が最初にフィドルをチェックしたとき、私はそれが正しく動作していないと思った。それから私は、フィドルとこの正規表現の正規表現があまり一致しないことに気付きました。上記のプラグを差し込むと、正しく機能しました。あなたの投稿を将来の訪問者のための新しいフィドルリンクに更新しました。私はそれを思っているように見えますが、これは私がそれと一緒に行く方向よりもはるかにきれいです。私が行った唯一の変更は、ユーザーが小文字を入力した場合に、[A-Z]を[A-Za-z]に変更することでした。 –

+0

'\ s'がスペースやタブ文字にマッチすることは事実です。しかし、ほとんどの場合、通常はタブのcharとマッチしたいので、 '\ s'は本当に役に立ち、正確にここで必要なものです。この場合でも、OPは '\ s'を使うべきです、私は彼がグループ(モードまたは応答)の一部としてタブ文字を受け入れるとは思いません。あなたはOPがうまくいくように思っていますが、このケースではリテラルスペースの代わりに '\ s'のようなものを使用したいと確信することはできません。 –

関連する問題