你需要使用一個匹配評估,或回調方法。重點是你可以檢查這個方法中的匹配和捕獲的組,並根據你的模式決定採取什麼動作。
因此,添加這個回調方法(可能非靜態如果調用方法是非靜態):
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;
}
然後,使用一個overload of Regex.Replace
with the match evaluator (=callback method):
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))|([[email protected]#$%^&*_.\w-]+)");
Console.WriteLine(rx.Replace(s, repl));
注意可以縮短用lambda表達式的代碼:
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 demo
很棒,你找到了適合你的解決方案。請考慮提供對您有幫助的答案。 –
因爲我是堆棧溢出的新手,所以現在我的能力已經超過了15我可以。 – brandonstrong