1

1つの数値を2つの異なる名前付きキャプチャグループとしてキャプチャする正規表現を記述できますか?

たとえば、値のペアをキャプチャしているが、値が1つしかない場合があります。

5, 5
3
2, 5

そして、単一の値を最初と2番目のキャプチャグループの両方として保存したいのですが、これは可能ですか?たとえば、私のグループの名前がfirstValueおよびsecondValueの場合:

firstValue = 5, secondValue = 5
firstValue = 3, secondValue = 3
firstValue = 2, secondValue = 5

この質問を単純化すると、次のようになります。同じキャラクターを複数のキャプチャグループに含めることは可能ですか?私は現在C#を使用していますが、これが他の言語でも可能かどうか知りたいと思います。

4

3 に答える 3

2

すべての場合に可能だとは思いませんが、例として使用できるいくつかのトリックを次に示します。

@"(?m)^(?=(?<firstValue>\d+\b))(?:\k<firstValue>, *)?(?<secondValue>\d+)\r?$"

最初の番号はグループにキャプチャされますfirstValueが、グループは先読みの中にあるため、一致位置は文字列の先頭に戻ります。2番目の番号がある場合、最初の番号の直後にコンマが続きます。(?:\k<firstValue>, *)?数値、コンマ、および末尾のスペースを消費しようとし(?<secondValue>\d+)、2番目の数値を取得します。

番号が1つしかない場合は、(?:\k<firstValue>, *)?何も消費しません。これはオプションなので問題ありません。これにより、一致位置は文字列の先頭のままになるため(?<secondValue>\d+)、今回はグループ内の最初の番号を再度キャプチャしsecondValueます。私たちは他に何もグループに入れようとはしなかったfirstValueので、その数もまだそこにあります。

あまりエレガントではありませんが、おそらく理解しやすい別のアプローチを次に示します。

@"(?m)^(?<secondValue>(?<firstValue>\d+))(?:, *(?<secondValue>\d+))?\r?$"

基本的に他のレスポンダーのソリューションと同じですが、両方のグループの最初の番号を取得することから始めます。2番目の数値があることが判明した場合、それはグループsecondValueにキャプチャされ、すでに存在する値を上書きします。グループfirstValueにはまだ最初の番号が含まれています。

于 2013-01-19T13:58:26.430 に答える
0

同じキャラクターを複数のキャプチャグループに含めることは可能ですか?

正解-いいえ(ネストされたキャプチャグループがない限り)。キャラクターがキャプチャされるか一致すると、再度一致することはできません。

?ただし、問題が単一の値を持つ場合がある場合は、数量詞を使用して2番目のキャプチャグループをオプションにすることができます。

(?<firstValue>\d+)(, (?<secondValue>\d+))?

これで、, secondValueオプションになりました。したがって、との両方に一致3, 53ます。

于 2013-01-18T17:15:13.210 に答える
0

いいえ、それはできません。代わりに、2番目の値を取得したかどうかを確認できます。

var values=Regex.Matches(@"(?<fv>\d+)(,\s*(?<sv>\d+))?")
  .Cast<match>()
  .Select(m=>
    new {
      firstValue=m.Groups["fv"].Value;
      secondValue=m.Groups["sv"].Value==""?m.Groups["fv"].Value:m.Groups["sv"].Value;
    }
  );
于 2013-01-18T17:44:02.093 に答える