5

式は既に記述されていますが、コードを実行するたびに、文字列全体と多数の null 値が取得されます。

Regex regex = new Regex(@"y=\([0-9]\)\([0-9]\)(\s|)\+(\s+|)[0-9]");
Match match = regex.Match("y=(4)(5)+6");

for (int i = 0; i < match.Length; i++)
{
    MessageBox.Show(i+"---"+match.Groups[i].Value);
}

予想される出力: 4、5、6 (異なるメッセージ ボックス内)

実際の出力: y=(4)(5)+6

入力された文字列が正しいかどうかを調べますが、正しい場合は特定の値 (4、5、および 6) を取得できません。そのコードを取得するにはどうすればよいですか? これはおそらく非常に単純なことですが、MSDN の match.NextMatch の記事を調べてみましたが、どちらも役に立たないようです。

ありがとうございました!

4

5 に答える 5

5

現在、指定されたグループはありません。(スペース周りを除く)

括弧を使用してグループを指定できます。現在使用している括弧にはバックスラッシュが含まれているため、それらはマッチングの一部として使用されています。それらの中に余分な括弧のセットを追加します。

そのようです:

new Regex(@"y=\(([0-9]+)\)\(([0-9]+)\)\+([0-9]+)");

そしてスペース付き:

new Regex(@"y\s*=\s*\(([0-9]+)\)\s*\(([0-9]+)\)\s*\+\s*([0-9]+)");

これにより、* は 0 以上を意味するため、パーツ間のスペースをオプションにすることもできます。スペースのグループが必要ないため、これは上記の (?:\s+|) よりも優れています。パイプは「または」を意味するため、これも優れています。\s+| で何を言っているのか は「1 つ以上のスペースまたは何もない」です。これは \s* と同じで、「0 個以上のスペース」になります。

また、[0-9]+ を使用しました。これは、1 桁以上を意味するためです。これにより、10 や 100 などの複数の数字を照合できます。また、[0-9] を使用することは \d よりも優れています。これは、\d が慣れ親しんだ数字以上のものを参照するためです。

于 2012-10-04T12:51:54.163 に答える
3

(名前付き) キャプチャ グループを使用します。また、キャプチャしたくないグループの(?:)代わりに使用する必要があります。それ以外の場合は、結果グループにも含まれます。()

Regex regex = new Regex(@"y=(\([0-9]\))((\([0-9]\))(?:\s|)\+(?:\s+|)([0-9])");
Match match = regex.Match("y=(4)(5)+6");
Console.WriteLine("1: " + match.Groups[1] + ", 2: " + match.Groups[2] + ", 3: " + match.Groups[3]);

パターンで一致が見つかった場合、その一致のグループがプロパティに書き込まれ、インデックスを介してアクセスできます (インデックス0には完全な一致が含まれます)。

これらのグループに名前を付けて、コードを読みやすくすることもできます。

Regex regex = new Regex(@"y=(?<first>\([0-9]\))(?<second>(\([0-9]\))(?:\s|)\+(?:\s+|)(?<third>[0-9])");

これで、などを使用してキャプチャ グループにアクセスできますmatch.Groups["first"]

于 2012-10-04T12:49:05.840 に答える
3

後で取り出せるように、グループに名前を付ける必要があります。.NET 正規表現で名前付きキャプチャ グループにアクセスするにはどうすればよいですか?

Regex regex = new Regex(@"y=\((?<left\>[0-9])\)\((?<right>[0-9])\)(\s|)\+(\s+|)(?<offset>[0-9])");

次に、次のようにそれらを引き出すことができます。

regex.Match("y=(4)(5)+6").Groups["left"];
于 2012-10-04T12:51:29.000 に答える
2

C# は私の専門分野外ですが、これでうまくいくかもしれません:

@"y=\(([0-9])\)\(([0-9])\)(?:\s|)\+(?:\s+|)([0-9])"

これは基本的に元の正規表現ですが、数値の周りにキャプチャ グループがあり、望ましくないキャプチャ グループが非キャプチャ グループに変更されています。(?: ... )

于 2012-10-04T12:49:09.703 に答える
2

Group[0] は、一致した文字列を常に提供します。null 値は (\s|) から取得されます。

これはうまくいきます:y=\((\d)\)\((\d)\)\s*\+\s*(\d)

使用するブラケットをカウントするのは 1 から始まるグループですが、それらをエスケープするとカウントされないため (それらは単に一致するテキストであることを伝えているため)、これらの数字には独自のブラケットが必要です。(x|)? のようなときに使用することもお勧めできません。または * そのビットをキャプチャしていないため、より適切です。

y=\((\d+)\)\((\d+)\)\s*\+\s*(\d+)これは、10 より大きい値をサポートするため、おそらくさらに優れています。

于 2012-10-04T12:49:14.460 に答える