如何一次性执行多个字符串替换?

时间:2010-02-11 10:09:01

标签: c# .net replace

我正在用C#编写一个应用程序,允许用户根据文件名执行数据库查询。

我正在使用Regex.Replace(string, MatchEvaluator)重载来执行替换,因为我希望用户能够拥有像SELECT * FROM table WHERE record_id = trim($1)这样的替换字符串,即使我们使用的数据库不支持修剪()。

我不想要的是进行一系列替换,如果$ 1的值包含“$ 2”,则两个替换都会发生。如何一次性执行多个字符串替换?我知道PHP的str_replace支持数组作为参数; C#有类似的功能吗?

3 个答案:

答案 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"