C# 替换字符串中字符选择的每个实例

C# 替换字符串中字符选择的每个实例,c#,replace,C#,Replace,我已经找到了很多类似的参考资料,但似乎没有一个是我想要的,所以希望有人能帮助我。 简单地说,我想将用户输入的字符串输入到Winform输入中,首先去掉所有空格,然后用英国货币符号替换任何“非法”字符列表。要求使用输入,但流程生成的文件具有修改后的文件名。 我编写了一个基于扩展方法的函数,但它的工作方式与预期不符: public static class ExtensionMethods { public static string Replace(this string

我已经找到了很多类似的参考资料,但似乎没有一个是我想要的,所以希望有人能帮助我。 简单地说,我想将用户输入的字符串输入到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=GHF16.5%MX/Y&1+1-这是正确的,因为它已删除空白。 fname=GH英镑F16英镑5英镑MX英镑Y英镑1英镑1-此操作不正确,因为它没有替换第一个字符,而是将其删除。
其余字符已正确替换。仅当其中一个“非法”字符位于字符串的开头时,才会发生此错误-如果我的字符串为GH F16.5%M X/Y&1+1,则我将正确获得G英镑H英镑F16英镑5英镑MX英镑Y英镑1英镑1。它还将多个“非法”字符替换为一个“;”,因此MGX+.1将变成M.GX.1,但应该是M.GX.1。

我认为问题在于替换扩展名。你在这条队伍里分裂

var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
您正在删除导致意外结果的空条目。改用这个:

var temp = s.Split(separators, StringSplitOptions.None);
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();
    }
}

我想问题出在你的分机上。你在这条队伍里分裂

var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries);
您正在删除导致意外结果的空条目。改用这个:

var temp = s.Split(separators, StringSplitOptions.None);
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();
    }
}

在Replace函数中使用split方法时,会得到以下字符串: GH,F16,5,MX,Y,1,1。 当您使用新的VAL加入他们时,您将获得: GH+newVal+F16+newVal+。。。因此省略了第一个替换字符


您可能需要一些特殊情况来检查第一个字符是否非法,并将newVal放在字符串的开头。

当您在Replace函数中使用split方法时,您会得到以下字符串: GH,F16,5,MX,Y,1,1。 当您使用新的VAL加入他们时,您将获得: GH+newVal+F16+newVal+。。。因此省略了第一个替换字符


您可能需要一些特殊情况来检查第一个字符是否非法,并将newVal放在字符串的开头。

出现此问题的原因是string.Join仅在子字符串之间放置分隔符-它永远不会将分隔符放在字符串的开头

一种可能的解决方案是避免使用string.Join和write Replace,如下所示:

var temp = s.Split(separators, StringSplitOptions.None);
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();
    }
}

出现问题的原因是string.Join只在子字符串之间放置分隔符-它永远不会在开头放置分隔符

一种可能的解决方案是避免使用string.Join和write Replace,如下所示:

var temp = s.Split(separators, StringSplitOptions.None);
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();
    }
}