1. ホーム
  2. c#

[解決済み】Regexで一部のグループのみを置換する。

2022-04-07 08:46:29

質問

次のような正規表現があるとします。

-(\d+)-

をC#で置き換えたいのですが、グループ1の (\d+)AA を、得ることができる。

-AA-

今度は、それを使って置き換えています。

var text = "example-123-example";
var pattern = @"-(\d+)-";
var replaced = Regex.Replace(text, pattern, "-AA-"); 

しかし、私はこれがあまり好きではありません。なぜなら、もしパターンを変更して _(\d+)_ で置換される文字列を変更する必要があります。 _AA_ これはDRYの原則に反しています。

みたいなのを探しているんです。

マッチしたテキストはそのままに、グループ1を次のように変更します。 this text とグループ2が another text ...

編集する

あくまで一例です。私は、上で述べたことを行うための一般的な方法を探しているだけです。

に使えるはずです。

anything(\d+)more_text と、思いつく限りのパターンを紹介します。

グループだけを置き換えて、残りのマッチを残したいだけなんです。

どのように解決するのですか?

良いアイデアは、識別が必要であろうとなかろうと、すべてをグループ内にカプセル化することでしょう。そうすれば、置換文字列の中でそれらを使用することができます。たとえば、次のようになります。

var pattern = @"(-)(\d+)(-)";
var replaced = Regex.Replace(text, pattern, "$1AA$3"); 

を使うか、MatchEvaluatorを使うかです。

var replaced = Regex.Replace(text, pattern, m => m.Groups[1].Value + "AA" + m.Groups[3].Value);


もう一つの方法は、少し面倒ですが、lookbehind/lookaheadを使用することです。

(?<=-)(\d+)(?=-)