質問: ``` Regex.Replace("HogeFugaPiyoHogera", "([a-z])([A-Z])", "$1-$2") ``` 上記の置換を行うと、結果は ``` Hoge-Fuga-Piyo-Hogera ``` となります。 場合によっては有用な置換方法だと思いますが、 どのような原理でこのような結果になるのか理解できません。 わかりやすく説明して頂けないでしょうか?
回答: ### 正規表現パターン `([a-z])([A-Z])` `[]` は中に記述されたいずれかの1文字に一致することを示すパターンです。 ここでの特殊な書き方として `a-z` として記述することで a から z までの文字を意味します。 つまり `[a-z]` は `[abcdefghijklmnopqrstuvwxyz]` と同じです。 なので `[a-z]` は「アルファベット小文字1文字」を示します。 同様に `[A-Z]` は「アルファベット大文字1文字」を示します。 `[a-z][A-Z]` で「アルファベット小文字のあとにアルファベット大文字」のパターンを示します。 入力文字列でこのパターンに当てはまるのが `eF` `aP` `oH` の3箇所です 入力文字列上では "Hog**eF**ug**aP**iy**oH**ogera" の太字の部分です。 `()`はグループ化する指定で、一致したパターンの文字列を記憶します。 `([a-z])([A-Z])` は、「`[a-z]`でマッチした文字」をグループ1、「`[A-Z]`でマッチした文字」をグループ2として記憶します。グループ番号は`()`で指定した順番で決まります。 記憶した文字列は置換先で使用されます。 ### 置換文字列 `$1-$2` マッチした部分を指定した文字列に置き換えます。この文字列は正規表現ではありません。 ここでのマイナス文字は前述の `a-z` のような特殊な意味はなく、そのまま `-` という文字です。 `$1` `$2` はパターンマッチで記憶されたしたグループ1、グループ2の文字列に対応します。 これを適用すると、 `eF` `aP` `oH` は `e-F` `a-P` `o-H` に置換されます。 結果、入力文字列は "Hog**e-F**ug**a-P**iy**o-H**ogera" という文字列に変換されます。太字の部分が置換された部分です。