在C#中替换不在字符串中的字符

时间:2017-08-16 07:39:45

标签: c#

什么是高位字符串的最佳方法,并用' - '替换不在字符串中的字符。在C#?

string allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ$_/+-.0123456789";
string str = "FoOB@R";

应该返回:" FOOB-R"

编辑: 我尝试使用正则表达式,但我忘记了" ^"在模式的开头: https://dotnetfiddle.net/dlrd3A

string str = "FoOb@R".ToUpper();
Regex r = new Regex("[ABCDEFGHIJKLMNOPQRSTUVWXYZ$_/+-.0123456789]");
String result = r.Replace(str, "-");
Console.WriteLine(result);

我会寻找使用linq,但我是这个语法的初学者,并且不知道如何开始。 但是linq比正则表达更快吗?

我忘了发布我的.NET小提琴代码,所以请不要这么快地对人们进行抨击;-)!

3 个答案:

答案 0 :(得分:4)

什么是最好? LINQ很简单:

str = str.ToUpper();
var allowed = str.Select(c => allowedChars.Contains(c) ? c : '-');
str = new string(allowed.ToArray());

答案 1 :(得分:2)

正则表达式将为您做到这一点:

Regex r = new Regex("[^ABCDEFGHIJKLMNOPQRSTUVWXYZ$_/+-.0123456789]");
String result = r.Replace("FoOb@R".ToUpper(), "-");

我们在方括号内定义一个允许的字符列表,这使得一个字符类意味着&#34;匹配任何这些单个字符&#34; ..但我们实际上想要相反,所以我们前缀为插入符号^。这反转了意义,因此它变成了#34; <+ 34;中没有的任何字符。

-替换的代码行很容易理解 - foobar字符串中不在字符类中的字符列表中的任何字符都用连字符替换。对ToUpper()的调用使字符串在替换之前变为大写。确保在之前而不是之后执行大写,因为默认情况下,您的字符类只有大写字符,而正则表达式区分大小写。将小写字符放入此替换操作将导致输出中有更多连字符:)

答案 2 :(得分:0)

        string allowedChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ$_/+-.0123456789";
        string str = "FoOB@R";

        string upperCaseStr = str.ToUpper();
        Console.WriteLine("Before:" upperCaseStr);              
        foreach (char ch in upperCaseStr)
        {
            if (!allowedChars.Contains(ch))
                upperCaseStr = upperCaseStr.Replace(ch, '-');
        }            
        Console.WriteLine("After:" upperCaseStr);