Regex.Replaceメソッドでは、別の文字列への置換・正規表現での置換のほか、マッチ箇所を検証して変換するメソッドを使って置換することもできます。 Regex.ReplaceメソッドにMatchEvaluatorデリゲートを指定することで、そのメソッドを呼び出した結果を置換文字列とすることができます。 置換時の動作をメソッドとして細かく規定することができるため、置換の正規表現要素だけでは記述できないような置換を行うことができます。
MatchEvaluatorデリゲートにはマッチ箇所の置換を行うメソッド(Matchクラスを引数にとり、置換後の結果となる文字列を返すメソッド)を指定します。 Replaceメソッドを呼び出してマッチする箇所が見つかると、マッチした箇所に該当するMatchインスタンスがMatchEvaluatorに渡されます。 MatchEvaluatorが返す文字列がマッチ箇所に置換され、Replaceメソッドの結果として返されます。
次の例では、Replaceメソッドを用いて拡張子にあたる部分を探索し、MatchEvaluatorデリゲートによって拡張子部分を".bak"
に置き換えています。
Regex.ReplaceメソッドとMatchEvaluatorを使ってマッチ箇所の文字列を置換する
Imports System
Imports System.Text.RegularExpressions
Class Sample
' マッチした箇所に置き換える文字列を返すメソッド
Shared Function ChangeExtension(ByVal m As Match) As String
' 引数mにはRegex.Replaceメソッドの呼び出しでマッチした箇所が設定されている
If m.Value.EndsWith(".bak")
' マッチした箇所が".bak"で終わる場合は、そのままにする
Return m.Value
Else
' そうでなければ、".bak"を追加する
Return m.Value + ".bak"
End If
End Function
Shared Sub Main()
Dim files() As String = New String() { _
"sample.txt", _
"sample.txt.bak", _
"sample.cs", _
"test.txt", _
"test.jpeg", _
"README" _
}
For Each file As String In files
Console.Write("{0,-20} => ", file)
' 正規表現にマッチした箇所をメソッドChangeExtensionが返す結果で置換する
Dim bakFile As String = Regex.Replace(file, "\..*", AddressOf ChangeExtension)
Console.WriteLine(bakFile)
Next
End Sub
End Class
実行結果
sample.txt => sample.txt.bak sample.txt.bak => sample.txt.bak sample.cs => sample.cs.bak test.txt => test.txt.bak test.jpeg => test.jpeg.bak README => README
Regex.Replaceメソッドで置換後の文字列を指定した場合、この文字列は単純な文字列ではなく正規表現として解釈され、$ で始まる正規表現要素を指定することが出来ます。