替换C#中的特殊字符字符串


Replace the string of special characters in C#

我的要求是:

I have to replace some special characters like * '" , _ & # ^ @ with string.Empty, and I have to replace blank spaces with -.

这是我的代码:

1
2
3
4
5
 Charseparated = Charseparated
    .Replace("*","")
    .Replace("'","")
    .Replace("&","")
    .Replace("@","") ...

要替换的字符太多,我必须使用要避免的Replace个字符。

是否有另一种有效的方法来删除特殊字符,但同时用-替换空格?


我相信,最好是在下面使用正则表达式

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

您可以为此目的使用Regex

1
2
3
4
5
Regex reg = new Regex("[*'",_
str1 = reg.Replace(str1, string.Empty);

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


使用正则表达式

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

它将用string.Empty和Space替换所有特殊字符,用"-"


进行一系列更改并对其进行迭代:

1
2
3
4
5
6
7
8
9
10
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);
}


您可以尝试使用LINQ:

1
2
3
4
5
6
  var source ="lala * lalala @ whowrotethis # ohcomeon &";

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

LINQ和char []方式:

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

它返回WHAT-POPO:

1
2
3
4
5
6
7
8
    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());
    }

OP要求一种"有效"的方式来替换字符串。

就使用Regex而言,性能不是最佳解决方案(如果是可读性或方便性,则可能是...)。

相反,StringBuilder的性能要好得多,如果处理大数据,这可能变得很重要。

1
2
3
4
5
 StringBuilder sb = new StringBuilder(myString);
 foreach (string unwanted in collectionOfUnwantedStrings)
         {
             sb.Replace(unwanted, string.Empty);
         }

string.Replace是可怕的,可怕的,可怕的,除最琐碎的任务外,其他任何地方都不应该由专业程序员使用。

字符串是不可变的。这意味着每次您执行string.replace(或myString = myString" lalala"等)时,系统都需要进行所有后勤工作(创建新指针,内容复制,垃圾回收等)。顺便说一句,帕特里克·帕特里克(Patrick)在上面的回答就做到了这一点(但具有更好的代码可读性)。

如果只需要执行几次,就没有问题了,并且代码可以立即读取。

但是一旦将此操作放入循环中,就需要以另一种方式编写它。我自己去找正则表达式:

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


您可以像这样使用正则表达式。

1
2
3
4
5
6
7
8
9
10
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]);

这是最理想,最简单的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    public void foo()
    {
        string input ="A sample input a*b#c@d";
        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
    }

string.Split与分隔符char数组一起使用,并将它们聚合回1个字符串中。不过,必须分别用string.Empty和用"-"替换""。

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

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

这将在给定字符串(source_string)中用'_'替换所有非字母和非数字。


使用特殊字符传递字符串。您只有一个没有特殊字符的字符串。注意-在"可替换"列表中添加特殊字符。

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

在一次采访中我问了同样的问题...给了我一个包含特殊字符的字符串,并要求我从输入字符串中删除特殊字符,然后将其反转。

这是简单有效的程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Program
    {
        static void Main(string[] args)
        {
            string name ="T@T@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;
        }
    }