我正在用C#编写一个应用程序,允许用户根据文件名执行数据库查询。
我正在使用Regex.Replace(string, MatchEvaluator)
重载来执行替换,因为我希望用户能够拥有像SELECT * FROM table WHERE record_id = trim($1)
这样的替换字符串,即使我们使用的数据库不支持修剪()。
我不想要的是进行一系列替换,如果$ 1的值包含“$ 2”,则两个替换都会发生。如何一次性执行多个字符串替换?我知道PHP的str_replace支持数组作为参数; C#有类似的功能吗?
答案 0 :(得分:3)
内置任何东西,但你可以尝试这样的东西:
string foo = "the fish is swimming in the dish";
string bar = foo.ReplaceAll(
new[] { "fish", "is", "swimming", "in", "dish" },
new[] { "dog", "lies", "sleeping", "on", "log" });
Console.WriteLine(bar); // the dog lies sleeping on the log
// ...
public static class StringExtensions
{
public static string ReplaceAll(
this string source, string[] oldValues, string[] newValues)
{
// error checking etc removed for brevity
string pattern =
string.Join("|", oldValues.Select(Regex.Escape).ToArray());
return Regex.Replace(source, pattern, m =>
{
int index = Array.IndexOf(oldValues, m.Value);
return newValues[index];
});
}
}
答案 1 :(得分:1)
你最好的方法是遍历一个字符串数组,并在每次迭代过程中调用Replace,一般来说这就是其他函数在幕后的作用。
更好的方法是创建自己的方法,就像PHP的str_replace工作方式一样。
请参阅下面的示例,或者您可以根据具体需要改变它
// newValue - Could be an array, or even Dictionary<string, string> for both strToReplace/newValue
private static string MyStrReplace(string strToCheck, string[] strToReplace, string newValue)
{
foreach (string s in strToReplace)
{
strToCheck = strToCheck.Replace(s, newValue);
}
return strToCheck;
}
答案 2 :(得分:1)
我认为循环使用模式和替换阵列是最佳选择。即使str_replace也有你所描述的问题。
echo str_replace(array("a", "b", "c"), array("b", "c", "d"), "abc");
result: "ddd"