Подтвердить что ты не робот

Замените строку специальных символов в С#

Мое требование:

Мне нужно заменить некоторые специальные символы, такие как * '", _ и # ^ @, на string.Empty, и мне нужно заменить пробелы на -.

Это мой код:

 Charseparated = Charseparated
    .Replace("*","")
    .Replace("'","")
    .Replace("&","")
    .Replace("@","") ...

Для замены многих символов мне нужно использовать целых Replace, которые я хочу избежать.

Есть ли другой эффективный способ удалить специальные символы, но в то же время заменить пробелы на -?

4b9b3361

Ответ 1

Я считаю, лучше всего использовать регулярное выражение здесь ниже

s/[*'",_&#^@]/ /g

Для этого вы можете использовать класс Regex

Regex reg = new Regex("[*'\",_&#^@]");
str1 = reg.Replace(str1, string.Empty);

Regex reg1 = new Regex("[ ]");
str1 = reg.Replace(str1, "-");

Ответ 2

Создайте коллекцию изменений и сделайте над ней:

var replacements = new []
                   { new { Old = "*", New = string.Empty }
                   // all your other replacements, removed for brevity
                   , new { Old = " ", New = "-" }
                   }

foreach (var r in replacements)
{
    Charseparated = Charseparated.Replace(r.Old, r.New);
}

Ответ 3

Использовать регулярное выражение

Regex.Replace("Hello*Hello'Hello&[email protected] Hello", @"[^0-9A-Za-z ,]", "").Replace(" ", "-")

Он заменит все специальные символы на string.Empty и Space с "-"

Ответ 4

Вы можете попробовать использовать LINQ:

  var source = "lala * lalala @ whowrotethis # ohcomeon &";

  var result = string.Concat(source.Select(c => c == ' ' 
     ? "-" 
     : "*'\",_&#^@".Contains(c) ? "" 
     : c.ToString()));

Ответ 5

Способ LINQ и char []:

   string f = Filter("*WHAT/ #PO#PO");

Он возвращает WHAT-POPO:

    private string Filter(string s)
    {
        var chars = new[] { '*', '/', '#' };
        var filteredChars = s.ToArray();
        return new string(filteredChars
                 .Where(ch => !chars.Contains(ch) )
                 .Select(ch => ch == ' ' ? '-' : ch).ToArray());
    }

Ответ 6

string.Replace ужасно, ужасно, ужасно и не должно использоваться профессиональными программистами нигде, кроме самых простых задач.

Строки неизменяемы. Это означает, что каждый раз, когда вы выполняете string.replace(или myString = myString + "lalala" и т.д.), Система должна выполнять всю логистику (создание нового указателя, копирование содержимого, сборка мусора и т.д.). Кстати, ответ Патрика выше делает именно это (но с лучшей читаемостью кода).

Если это нужно сделать всего несколько раз, это не проблема - и код сразу читается.

Но как только вы поместите эту операцию в цикл, вам нужно записать ее по-другому. Я сам поеду на regex:

string inStr = "lala * lalala @ whowrotethis # ohcomeon &";
string outStr = Regex.Replace(inStr , "[*|@|*|&]", string.Empty);

Ответ 7

OP запросил "эффективный" способ замены строк.

С точки зрения производительности с использованием Regex это не лучшее решение (в случае удобочитаемости или удобства оно может быть...).

Вместо этого StringBuilder преформирует достаточно хорошо, что может стать важным, если вы имеете дело с большими данными.

 StringBuilder sb = new StringBuilder(myString);
 foreach (string unwanted in collectionOfUnwantedStrings)
         {
             sb.Replace(unwanted, string.Empty);
         }

Ответ 8

Используйте string.Split с массивом символов разделителя и суммируйте их обратно в 1 строку. Замена string.Empty и "на" -" должна выполняться отдельно.

        var res = "23#$36^45&".Split(new[] {'#', '$', '^', '&'}, StringSplitOptions.RemoveEmptyEntries)
            .Aggregate((s, s1) => s + s1);
        // "233645"

Ответ 9

Вот наиболее оптимальный и простой способ сделать это

    public void foo()
    {
        string input = "A sample input a*b#[email protected]";
        string unwanted = "*'\",_&#^@";
        List<char> unwantedChars = unwanted.ToList<char>();
        StringBuilder sb = new StringBuilder();

        input = input.Replace(' ', '-');
        foreach(char c in input)
        {
            if (!unwantedChars.Any(x => x == c))
                sb.Append(c);
        }
        string output = sb.ToString(); //A-sample-input-abcd
    }

Ответ 10

Вы можете использовать Regex, как это.

string Charseparated = "test * -";

var replacements = new Dictionary<string, string>()
{
   {"*", string.Empty},
   {" ", "-"}
};

var reg = new Regex(String.Join("|", replacements.Keys.Select(k => Regex.Escape(k))));
var reg_replace = reg.Replace(Charseparated, m => replacements[m.Value]);

Ответ 11

передать строку со специальными символами. Вы получили только строку без специальных символов. Примечание - добавьте свои специальные символы в список "заменяемые".

protected string hasSpecialChar(string input)
        {
            string[] replaceables = new[] { @"\", "|", "!", "#", "$", "%", "&", "/", "=", "?", "»", "«", "@", "£", "§", "€", "{", "}", "^", ";", "'", "<", ">", ",", "'" };
            string rxString = string.Join("|", replaceables.Select(s => Regex.Escape(s)));
            return Regex.Replace(input, rxString, "-");
        }

Ответ 12

Regex.Replace(source_string, @"[^\w\d]", "_");

Это заменит все не алфавиты и не числа с '_' в данной строке (source_string).

Ответ 13

Тот же вопрос был задан мне в интервью... мне была дана строка, содержащая специальные символы, и мне было предложено удалить специальные символы из входной строки и затем отменить ее.

Вот простая и эффективная программа:

public class Program
    {
        static void Main(string[] args)
        {
            string name = "[email protected]@P&!M#";

            Program obj = new Program();

            Console.WriteLine(obj.removeSpecialCharacters(name));

            Console.WriteLine(obj.reverseString(obj.removeSpecialCharacters(name)));

            Console.ReadLine();


        }

        private string removeSpecialCharacters(string input)
        {
            string[] specialCharacters = new string[] { "@", "&", "!", "#" };

            for (int i = 0; i < specialCharacters.Length; i++)
            {
                if (input.Contains(specialCharacters[i]))
                {
                    input = input.Replace(specialCharacters[i], "");
                }
            }

            return input;
        }

        private string reverseString(string input)
        {
            string reverseString = "";

            for (int i = input.Length - 1; i >= 0; i--)
            {
                reverseString = reverseString + input[i];
            }

            return reverseString;
        }
    }