我找到了很多与此类似的引用文献,但似乎没有一个正是我所追求的,所以希望有人能提供帮助。
简单来说,我想获取用户输入的字符串(进入 Winform 输入),首先去掉所有空格,然后用英国货币符号 (£) 替换任何“非法”字符列表。要求是要使用输入,但进程生成的文件具有修改后的文件名。
我写了一个函数(基于扩展方法)但它没有按预期工作:
public static class ExtensionMethods
{
public static string Replace(this string s, char[] separators, string newVal)
{
var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
return String.Join(newVal, temp);
}
}
public static string RemoveUnwantedChars(string enteredName, char[] unwanted, string rChar)
{
return enteredName.Replace(unwanted, rChar);
}
在我的代码中,我调用了两次:
char[] blank = { ' ' };
string ename = Utilities.RemoveUnwantedChars(this.txtTableName.Text, blank, string.Empty);
char[] unwanted = { '(', ')', '.', '%', '/', '&', '+' };
string fname = Utilities.RemoveUnwantedChars(ename, unwanted, "£");
如果我输入的字符串至少包含一个空格、上面的所有字符和一些其他字母(例如,“(GH) F16.5% M X/Y&1+1”),我会得到以下结果:
ename = "(GH)F16.5%MX/Y&1+1"- 这是正确的,因为它删除了空白。
fname = "GH£F16£5£MX£Y£1£1"- 这没有正常工作,因为它没有替换第一个字符而是删除了它。
其余字符已被正确替换。只有当其中一个“非法”字符位于字符串的开头时才会发生 - 如果我的字符串是“G(H) F16.5% M X/Y&1+1”,我会正确地得到“G£H£F16£” 5£MX£Y£1£1"。它还将多个“非法”字符替换为一个“£”,因此“M()GX+.1”将变为“M£GX£1”,但应为“M££GX££1”。
最佳答案
我认为问题出在您的 Replace 扩展中。你在这一行 split
var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
您正在删除导致意外结果的空条目。改用这个:
var temp = s.Split(separators, StringSplitOptions.None);
关于c# 替换字符串中字符选择的每个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36397985/