C# 字符串中的字符替换

C# 字符串中的字符替换,c#,asp.net,string,character-encoding,character-replacement,C#,Asp.net,String,Character Encoding,Character Replacement,我确实需要一个能正常工作的ASP.NET C#代码来替换字符串中的字符 我下面的代码工作正常,但在输入“a”的情况下,它给我的输出是“678d”,但在输入“c”的情况下,输出是正确的,因为它是“8d”。。。在这里,它也会自动替换其余值。我可以看到代码正在一步一步地执行。。。这导致我得到一个重载输出 { StringBuilder builder = new StringBuilder(); builder.Replace("a", "6b"); builder.Repla

我确实需要一个能正常工作的ASP.NET C#代码来替换字符串中的字符

我下面的代码工作正常,但在输入“a”的情况下,它给我的输出是“678d”,但在输入“c”的情况下,输出是正确的,因为它是“8d”。。。在这里,它也会自动替换其余值。我可以看到代码正在一步一步地执行。。。这导致我得到一个重载输出

{
    StringBuilder builder = new StringBuilder();
    builder.Replace("a", "6b");
    builder.Replace("b", "7c");
    builder.Replace("c", "8d");
    return builder.ToString();
}

现在,我确实需要将“a”替换为“6b”,它不应加载其余值。

您需要更改替换的顺序:

StringBuilder builder = new StringBuilder();
builder.Replace("c", "8d");
builder.Replace("b", "7c");
builder.Replace("a", "6b");
return builder.ToString();

您的代码正在从一个语句下降到另一个语句——因此首先用6b替换a,然后用7c替换6b中的b,依此类推

因此,在您的特定情况下,您可以改变语句的顺序,以便后面的语句不会对前面的语句做出反应,如

建造商。替换(“c”、“8d”)

建造商。替换(“b”、“7c”)

建造商。替换(“a”、“6b”)


为了更独立于实际更换,您可以进行双向更换:

首先用不会出现在字符串中的占位符替换出现的内容(如%%1%%替换“a”,%%2%%替换“b”等)

然后在第二次运行时,将%%1%%替换为“8d”,将%%2%%替换为“7c”等

这在任何情况下都有效。

尝试以下方法:

Regex rx = new Regex("a|b|c");

string str = "abc";

MatchEvaluator matcher = match => {
    string value = match.Value;
    if (value == "a") {
        return "6b";
    } else if (value == "b") {
        return "7c";
    } else {
        return "8d";
    }
};

var str2 = rx.Replace(str, matcher);
或者,如果您不想使用正则表达式:

static void Main(string[] args)
{
    var replacements = new[] {
        new Tuple<string, string>("a", "6b"), 
        new Tuple<string, string>("b", "6c"), 
        new Tuple<string, string>("c", "6a")
    };

    string str = "adbc";
    var str2 = MultipleReplace(str, replacements);
}

static string MultipleReplace(string str, IEnumerable<Tuple<string, string>> replacements) {
    StringBuilder str2 = new StringBuilder();

    for (int i = 0; i < str.Length; i++) {
        bool found = false;

        foreach (var rep in replacements) {
            if (str.Length - i >= rep.Item1.Length && str.Substring(i, rep.Item1.Length) == rep.Item1) {
                str2.Append(rep.Item2);
                i += rep.Item1.Length - 1;
                found = true;
                break;
            }
        }

        if (!found) {
            str2.Append(str[i]);
        }
    }

    return str2.ToString();
}
static void Main(字符串[]args)
{
var替换=新[]{
新元组(“a”、“6b”),
新元组(“b”、“6c”),
新元组(“c”、“6a”)
};
string str=“adbc”;
var str2=多重替换(str,替换);
}
静态字符串多重替换(字符串str、IEnumerable替换){
StringBuilder str2=新的StringBuilder();
对于(int i=0;i=rep.Item1.Length&&str.Substring(i,rep.Item1.Length)==rep.Item1){
str2.追加(rep.Item2);
i+=rep.Item1.Length-1;
发现=真;
打破
}
}
如果(!找到){
str2.Append(str[i]);
}
}
返回str2.ToString();
}

您可以在字母后面使用空格。将“a”替换为“a”,并将“a”替换为所需文本。

谢谢您的回答,但我刚刚给出了一个示例代码。在我的原始代码中,一个位必须替换为1000位,因此,更改顺序将导致无效。我需要一个代码,它独立地运行每一行,而不依赖于下一行或前一行…我想这将是可能的使用数组语句。。。不确定,但只是一个公平的猜测。。。!您必须使用System.Text.RegularExpressions添加
错误名称空间元组和IEnumerable,但找不到:(希望此代码有效,但有一些错误,请进一步帮助我…感谢您的回答…@Karthik在出现错误的代码上右键,解析并选择以“using”开头的第一行).第一个示例需要.NET 3.5,第二个需要.NET 4.0。感谢您的回答,希望在某些情况下对我有所帮助…但是代码很混乱…无论如何,非常感谢。。。。