C#调用字符串方法后值未变化,Replace替换失效是什么原因?
问题原因
- C#中字符串的
Replace方法默认是区分大小写匹配子串的,你执行myName = myName.ToUpper();之后,myName的值已经从初始的"Jhon"转为全大写的"JHON"。 - 后续执行
Replace("Jhon", "doe")时,要匹配的目标子串是大小写混合的"Jhon",和当前myName中存储的"JHON"大小写完全不匹配,因此匹配失败,Replace方法直接返回原字符串,没有发生替换操作。 - 之后再次调用的
ToUpper方法处理已经是全大写的字符串,不会产生任何变化,因此最终两次输出的内容都是Hello JHON。
修复方案
方案1:调整操作顺序,先替换再统一转大写
优先执行替换操作,再统一处理大小写,避免大小写不匹配的问题:
string myName = "Jhon"; // 先替换子串,再统一转为大写 myName = myName.Replace("Jhon", "doe").ToUpper(); Console.WriteLine($"Hello {myName}"); // 输出:Hello DOE
方案2:匹配全大写的目标子串
如果需要先执行转大写操作,把Replace方法的目标匹配子串改为全大写即可:
string myName = "Jhon"; myName = myName.ToUpper(); // 匹配全大写的"JHON" myName = myName.Replace("JHON", "doe").ToUpper(); Console.WriteLine($"Hello {myName}"); // 输出:Hello DOE
方案3:使用忽略大小写的重载替换方法
如果需要保留先转大写的逻辑,同时不需要修改匹配子串的大小写,可以使用支持StringComparison参数的Replace重载(.NET Core 2.1+、.NET 5+ 及更高版本支持):
string myName = "Jhon"; myName = myName.ToUpper(); // 忽略大小写匹配子串 myName = myName.Replace("Jhon", "doe", StringComparison.OrdinalIgnoreCase).ToUpper(); Console.WriteLine($"Hello {myName}"); // 输出:Hello DOE
内容的提问来源于stack exchange,提问作者harsha_wije97
相关产品推荐
相关产品推荐

