2010-02-11 3 views
2

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

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

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

ответ

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

Лучше всего выполнить цикл через массив строк и вызвать Replace во время каждой итерации, как правило, это то, что другие функции будут делать под капотом.

Еще лучше было бы создать свой собственный метод, который сделает именно это, подобно тому, как работает str_replace PHP.

пример ниже, в качестве альтернативы вы можете изменять его в зависимости от ваших конкретных потребностей

// 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; 
} 
+0

У меня есть проблема, которую я хочу избежать - первый раз через цикл можно поместить значение, которое будет заменено в следующий раз. В вашем примере это не так плохо, потому что у вас есть только одно новое значение, но я хочу также массив новых значений. – Simon

1

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

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

result: "ddd" 
+0

В основном вы, кодер, должны убедиться, что шаблон не соответствует замену, который приходит позже в массиве соответственно. –

+0

Я не понимал, что о str_replace - спасибо за проверку! – Simon

Смежные вопросы