c#替换字符串

时间:2016-04-04 08:39:38

标签: c# replace

我发现许多引用与此类似,但似乎没有一个是我所追求的,所以希望有人可以提供帮助。
简单来说,我想获取用户输入的字符串(进入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”。

3 个答案:

答案 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放在字符串的开头。