Страницы

Поиск по вопросам

среда, 29 января 2020 г.

Как в строке заменить все символы из набора на пустое в C#?

#c_sharp


Можно ли написать как то компактнее данный фрагмент кода или нет? 

string newString = oldString.Replace(" ","")
                                .Replace(" ", "")
                                .Replace("-", "")
                                .Replace(".", "")
                                .Replace(",", "")
                                .Replace("(", "")
                                .Replace(")", "")
                                .Replace("{", "")
                                .Replace("}", "")
                                .Replace("[", "")
                                .Replace("]", "")
                                .Replace("!", "")
                                .Replace("@", "")
                                .Replace("#", "")
                                .Replace("$", "")
                                .Replace("%", "")
                                .Replace("^", "")
                                .Replace("*", "")
                                .Replace("+", "")
                                .Replace("=", "")
                                .Replace(":", "")
                                .Replace(";", "")
                                .Replace("/", "")
                                .Replace(@"\", "");

    


Ответы

Ответ 1



Можно воспользоваться Regex.Replace - в указанной входной строке заменяет все строки, соответствующие шаблону регулярного выражения, указанной строкой замены. string input = "This @#$[ываыв] %is text with some test data %$ dsffs !@#$%"; string pattern = "[-.,(){}@#$%^&*!+=:;/\\[\\]]+"; string replacement = ""; Regex rgx = new Regex(pattern); string result = rgx.Replace(input, replacement); // This @#$[ываыв] %is text with some test data %$ dsffs !@#$% Console.WriteLine("Original String: {0}", input); // This ываыв is text with some test data dsffs Console.WriteLine("Replacement String: {0}", result); http://ideone.com/CVYgJG Я не знаток регулярок, но как пример, думаю, это поможет найти правильный путь.

Ответ 2



Как вам и советовали выше, воспользуйтесь регуляркой. Проблема вашего кода не только в его многословности и дублировании, но ещё и в том, что при каждом вызове Replace строка создаётся заново (в силу неизменяемости строк в C#). Поэтому если строки достаточно большие и/или этот код будет вызываться много раз, вы рискуете получить существенный оверхед на многократное пересоздание вашей строки. Не берусь судить, что там происходит в недрах Regex.Replace, но наверняка его алгоритм подходит к этому вопросу существенно экономнее, нежели многократный вызов Replace с пересозданием строки.

Ответ 3



Если количество вызовов и/или размеры строк достаточно велики, то рекомендую следующий метод, который существенно (в несколько раз) выигрывает по скорострельности у Regex: private static string ClearString(string s) { StringBuilder sb = new StringBuilder(s.Length); foreach (char c in s) { switch (c) { case ' ': case '\t': case '-': case '+': case '=': case '.': case ',': case ':': case ';': case '(': case ')': case '{': case '}': case '[': case ']': case '!': case '@': case '#': case '$': case '%': case '^': case '&': case '*': case '\\': case '/': break; default: sb.Append(c); break; } } return sb.ToString(); } Компактностью тут, конечно, и не пахнет, но эффективность достойная.

Комментариев нет:

Отправить комментарий