4

C# で正規表現を使用しているときに問題が発生しました。つまり、デバッガーは正しい(IMO)結果を表示しますが、アプリケーションで結果を印刷しようとすると、それらは異なります(そして間違っています)。以下のコード:

Match match2 = Regex.Match("048 A Dream Within A Dream (satur) (123|433) K48", "(.*)(\\((.)*?\\))\\s\\((.)*?\\)\\s.*");
string nick = match2.Groups[1].Value;
string name = match2.Groups[0].Value;
Console.WriteLine("nick - '{0}', name - '{1}'", nick, name);

次のスクリーンショットのように、期待される結果がデバッガーに表示されます。ここに画像の説明を入力

コンソールは異なる (間違った) 結果を示します:

ニック - '048 夢の中の夢'、名前 - '048 夢の中の夢 (satur) (123|433) K48'

どうすれば修正できますか?デバッガーとまったく同じように結果を表示したい。

4

2 に答える 2

9

常に試合全体Groups[0]を表すことを意図しているという事実を見逃しています。最初のキャプチャ グループは にあります。あなたがしたい:Groups[1]

string nick = match2.Groups[2].Value;
string name = match2.Groups[1].Value;

デバッガーで期待どおりに表示されている理由は、内のフィールドの実装の詳細GroupCollectionを見ているからです。番号によるグループを要求された場合、要求された番号が 0 の場合は一致を返し、それ以外の場合は番号を 1 だけオフセットします。

のドキュメントからGroupCollection:

一致が成功した場合、コレクションの最初の要素には、一致全体に対応する Group オブジェクトが含まれます。正規表現にキャプチャ グループが含まれている場合、後続の各要素はキャプチャ グループを表します。

于 2013-09-02T21:17:22.383 に答える
3

フィールドを調べていますが、プロパティ_groupsとして返されるものは正確ではありません:Groups

ここに画像の説明を入力

Groups[1]コードを次のように変更しますGroups[2]

string nick = match2.Groups[2].Value;
string name = match2.Groups[1].Value;
于 2013-09-02T21:19:34.440 に答える