我发现许多引用与此类似,但似乎没有一个是我所追求的,所以希望有人可以提供帮助。
简单来说,我想获取用户输入的字符串(进入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%MX / Y& 1 + 1”),我得到以下内容结果:
ename =“(GH)F16.5%MX / Y& 1 + 1” - 这是正确的,因为它已经删除了空白。
fname =“GH£F16£5£MX£Y£1£1” - 由于它没有替换第一个字符但是将其删除,因此无法正常工作。
其余的角色已被正确替换。它只发生在其中一个'非法'字符位于字符串的开头 - 如果我的字符串是“G(H)F16.5%MX / Y& 1 + 1”,我会正确地得到“G£H£ F16£5££MXÿ££1 1" 。它还用一个'£'替换多个'非法'字符,因此“M()GX + .1”将变为“M£GX£1”,但应该是“M£GX£1”。
答案 0 :(得分:3)
我认为问题出在您的替换扩展程序中。你正在分裂这一行
var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
您正在删除导致意外结果的空条目。请改用:
var temp = s.Split(separators, StringSplitOptions.None);
答案 1 :(得分:2)
问题出现了,因为string.Join()
只在子串之间放置分隔符 - 它永远不会放置一个。
一种可能的解决方案是避免使用string.Join()
并像这样写Replace()
:
public static class ExtensionMethods
{
public static string Replace(this string s, char[] separators, string newVal)
{
var sb = new StringBuilder(s);
foreach (char ch in separators)
{
string target = new string(ch, 1);
sb.Replace(target, newVal);
}
return sb.ToString();
}
}
答案 2 :(得分:0)
在Replace函数中使用split方法时,会得到以下字符串: GH,F16,5,MX,Y,1,1。 当您使用newVal加入它们时,您会得到: GH + newVal + F16 + newVal + ...因此省略了第一个被替换的角色。
您可能需要一些特殊情况来检查第一个字符是否是"非法"并将newVal放在字符串的开头。