什么是高位字符串的最佳方法,并用' - '替换不在字符串中的字符。在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小提琴代码,所以请不要这么快地对人们进行抨击;-)!
答案 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);