C#字符串替换方法 字符串A,从第一个出现字符串B的位置开始,把字符串C1的内容替换为C2,把D1的内容替换为D2,而且两次替换不交叉,即各替换各的。即第一次替换完了后,A中可能会含有D1的内容,这种情况不替换为D2。如:A= “my !name is ****!” B=“y” C1= "!" C2= "*" D1= "*" D2= "#"结果应该是"my *name is ####*"解决方法:替换单个字符的 internal void ChangeWchar(/*string mStr,string findStr,string replace str*/) { string str="my !name is ****!"; string C1="!", C2="*", D1="*", D2="#"; string resultStr = ""; for (int i = 0; i < str.Length; i++) { if (string.Compare(C1, str.Substring(i,1)) == 0) resultStr += C2; else if (string.Compare(D1, str.Substring(i,1)) == 0) resultStr += D2; else resultStr += str.Substring(i,1); } } 下面是替换串的 class FindReplaceStrStru { public int s, e; } internal void ChangeStr(/*自定义参*/) { string str = "my !name is ****!"; string C1 = "!", C2 = "*", D1 = "*", D2 = "#";//设定优先级,若要替换的c1串中含有c2串,如:c1="12345" c2="23" string resultStr = ""; //以c1优先为例子。 //先定义一个“碎片”数组,只为了方便说明问题而定义,实际考虑效率可去掉,并改写函数 //此段是保存不包含优先级1的字符串 - 段位置。 List<FindReplaceStrStru> rp2list = new List<FindReplaceStrStru>(); int sID = 0, eID = 0; while (true) { eID = sID; sID = str.IndexOf(C1, sID); if (sID >= 0) { rp2list.Add(new FindReplaceStrStru()); rp2list[rp2list.Count - 1].s = eID == 0 ? 0 : eID + C1.Length;//此处若首次查找在0位置成功找到,可能会加一条无用的段,可在这这前加个判断是否为零,若为则不加 rp2list[rp2list.Count - 1].e = sID; sID += C1.Length; //画图你就明白了如: // |*****&&&&&****&&&*&&&&&****&&&&&|取不包含优先级1的段。 } else break; } //if((sID)<str.Length) //最后检查一下,若没有到未尾,则加上尾段。 //到此你可以你用查找单个字符的思路,用重新连接一个字符串的方式,而不是直接替换,因为要 替换的c1长度为2,但替换后的c2可能长度为3,所以会改变长度,不可直接替换,用重新连接一个新串的方法 |