Замените строку специальных символов в С#
Мое требование:
Мне нужно заменить некоторые специальные символы, такие как * '", _ и # ^ @, на string.Empty
, и мне нужно заменить пробелы на -
.
Это мой код:
Charseparated = Charseparated
.Replace("*","")
.Replace("'","")
.Replace("&","")
.Replace("@","") ...
Для замены многих символов мне нужно использовать целых Replace
, которые я хочу избежать.
Есть ли другой эффективный способ удалить специальные символы, но в то же время заменить пробелы на -
?
Ответы
Ответ 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;
}
}