Альтернатива String.Replace

Итак, сегодня я писал код, который в основном выглядит так:

string returnString = s.Replace("!", " ")
            .Replace("@", " ")
            .Replace("#", " ")
            .Replace("$", " ")
            .Replace("%", " ")
            .Replace("^", " ")
            .Replace("*", " ")
            .Replace("_", " ")
            .Replace("+", " ")
            .Replace(" = ", " ")
            .Replace("\", " ")

Что не очень приятно. Мне было интересно, есть ли регулярное выражение или что-то, что я мог бы написать, чтобы заменить все вызовы функции Replace()?

@lomaxx: см. решение dimitre, которое вообще избегает использования регулярных выражений.

Dimitre Novatchev 09.12.2008 17:57

@Cawas: Здесь: dnovatchev.spaces.live.com/blog/cns!44B0A32C2CCF7488!353.ent‌ ry См. Описание функции XPath translate () здесь: w3.org/TR/xpath-functions/#func-translate

Dimitre Novatchev 11.05.2010 23:23

@dimitre круто, xpath хорош. Но как я мог узнать это только из вашего комментария?

cregox 12.05.2010 01:44

@Cawas: Я удалил свой ответ почти сразу после того, как опубликовал его в декабре 2008 года (сразу получил два отрицательных голоса). К сожалению, для многих людей, интересующихся C#, даже упоминание XSLT оскорбительно :(. Такие люди теряют способность к рациональному / критическому мышлению.

Dimitre Novatchev 12.05.2010 02:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
19
4
5 237
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы можете использовать Regex.Replace (). Все символы могут быть помещены в квадратные скобки, что соответствует любому символу в квадратных скобках. Некоторые специальные символы должны быть экранированы обратной косой чертой, и я использую здесь строку @verbatim, поэтому мне не нужно экранировать их дважды для компилятора C#. Первый параметр - это строка ввода, а последний параметр - строка замены.

var returnString = Regex.Replace(s,@"[!@#$%\^*_\+=\]"," ");

s/[!@#$%^*_+=\]/ /

Было бы для него регулярное выражение ... в C# вы должны иметь возможность использовать

Regex.Replace(yourstring, "[!@#$%^*_+=\]", "" ); 

Хотя мой C# ржавый ..

К вашему сведению - если вам нужно изменить это регулярное выражение, вам нужно знать язык регулярных выражений. Это довольно просто, и как разработчик вы действительно обязаны добавлять регулярные выражения в свой набор инструментов - они вам не нужны каждый день, но возможность применять их соответствующим образом там, где это необходимо, когда возникнет необходимость, окупит вас. в десять раз больше за начальное усилие. Вот ссылка на веб-сайт с первоклассными, простыми в использовании учебными пособиями и справочными материалами по регулярным выражениям: regular-expressions.info. Как только вы почувствуете регулярные выражения и захотите использовать их в своем программном обеспечении, вы захотите купить Regex Buddy. Это дешевый и необычный инструмент для изучения и использования регулярных выражений. Я очень редко покупаю инструменты разработки, но этот стоил каждого пенни. Это здесь: Регулярное выражение Бадди

Если вы не хотите углубляться в Regex, вот пара других возможностей метода расширения.

Вы можете передать конкретные символы, которые хотите заменить:

static public string ReplaceCharsWithSpace(this string original, string chars)
{
    var result = new StringBuilder();
    foreach (var ch in original)
    {
        result.Append(chars.Contains(ch) ? ' ' : ch);
    }
    return result.ToString();
}

Или, если вы знаете, что хотите сохранить или исключить только определенные типы символов, вы можете использовать различные методы в char, такие как IsLetter, IsDigit, IsPunctuation и IsSymbol:

static public string ReplaceNonLetterCharsWithSpace(this string original)
{
    var result = new StringBuilder();
    foreach (var ch in original)
    {
        result.Append(char.IsLetter(ch) ? ch : ' ');
    }
    return result.ToString();
}

Вот как вы могли бы использовать каждую из этих возможностей:

string s = "ab!2c";
s = s.ReplaceCharsWithSpace(@"!@#$%^*_+=/");  // s contains "ab  c"

string t = "ab3*c";
t = t.ReplaceNonLetterCharsWithSpace();  // t contains "ab  c"

Возможно, вы можете сократить это до пары строк, если хотите, используя лямбда-выражение и List<>, ForEach.

using System.Collections.Generic;

namespace ReplaceWithSpace 
 {
    class Program 
    {
        static void Main(string[] args) 
        {
            string someString = "#1, 1+1=2 $string$!";

            var charsToRemove = new List<char>(@"!@#$%^*_+=\");
            charsToRemove.ForEach(c => someString = someString.Replace(c, ' '));

            System.Diagnostics.Debug.Print(someString); //" 1, 1 1 2  string  "
        }
    }

}

Проблема с этим подходом заключается в том, что для каждого заменяемого символа создается множество промежуточных строк. Это та же проблема, что и исходный вопрос, который решает решение регулярного выражения.

Duncan 18.10.2008 16:06

Другие вопросы по теме