マッチ エバリュエーターまたはコールバック メソッドを使用する必要があります。ポイントは、このメソッド内で一致グループとキャプチャ グループを調べて、パターンに応じて実行するアクションを決定できることです。
したがって、このコールバック メソッドを追加します (呼び出し元のメソッドが非静的である場合、非静的である可能性があります)。
public static string repl(Match m)
{
return !string.IsNullOrEmpty(m.Groups[1].Value) ?
m.Value.Replace(m.Groups[1].Value, string.Format("'{0}'", m.Groups[1].Value)) :
m.Value;
}
次に、一致評価器 (=callback メソッド) でのオーバーロードをRegex.Replace
使用します。
var s = "'This is not captured' but this is and not or empty() notempty() currentdate() capture";
var rx = new Regex(@"(?:'[^']*'|(?:\b(?:(?:not)?empty|currentdate)\(\)|and|or|not))|([!@#$%^&*_.\w-]+)");
Console.WriteLine(rx.Replace(s, repl));
ラムダ式を使用してコードを短縮できることに注意してください。
Console.WriteLine(rx.Replace(s, m => !string.IsNullOrEmpty(m.Groups[1].Value) ?
m.Value.Replace(m.Groups[1].Value, string.Format("'{0}'", m.Groups[1].Value)) :
m.Value));
IDEONE デモを見る