Как выполнить несколько замен строк за один раз? - PullRequest
2 голосов
/ 11 февраля 2010

Я пишу приложение на C #, которое позволяет пользователю выполнять запросы к базе данных на основе имен файлов.

Я использую перегрузку Regex.Replace(string, MatchEvaluator) для выполнения замен, потому что я хочу, чтобы у пользователя была возможность иметь строки замены, такие как SELECT * FROM table WHERE record_id = trim($1), даже если используемая БД не поддерживает такие функции, как trim ().

Чего я не хочу, так это делать серию замен, где, если значение $ 1 содержит «$ 2», происходят обе замены. Как выполнить несколько замен строк за один раз? Я знаю, что PHP str_replace поддерживает массивы в качестве аргументов; есть ли подобная функция для C #?

Ответы [ 3 ]

3 голосов
/ 11 февраля 2010

Нет ничего встроенного, но вы можете попробовать что-то вроде этого:

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 голос
/ 11 мая 2012

Я думаю, что циклическая обработка массивов шаблонов и замен - лучший вариант. Даже str_replace имеет проблему, которую вы описывали.

echo str_replace(array("a", "b", "c"), array("b", "c", "d"), "abc");

result: "ddd"
1 голос
/ 11 февраля 2010

Самое лучшее, что вам нужно - это циклически проходить через массив строк и вызывать 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...