今天得到一个bug反馈,反应有个客户端得出的信息不对,看了下是从excel中取出来的数据转换为string字符串显示给用户,一步步debug,发现程序本身没问题,就是取出第10列的值开始出现问题,看了很久发现出现在Replace这个函数上:
字符串str =str.Replace(第一个参数循环取的(1,2,3。。9,10,11)第二个参数( 值1,值2,。。值10,。。)这样表述可能不太正确,但问题是值1中的1和值10中10都成功的把1这个值给替换了导致显示的时候到第10列出现了问题。。听得懂不?
现在需要解决的是如何搞个替代方法解决这个bug!
代码如下:
1 if (ds.Tables.Count > 0) 2 { 3 int Colum = ds.Tables[0].Columns.Count; 4 for (int i = 0; i < 1; i++) 5 { 6 for (int j = 1; j < Colum; j++) 7 { 8 TitleContent += ds.Tables[0].Rows[i][j] + "FTep" + "" + j + "" + ","; 9 } 10 } 11 foreach (DataRow dr in ds.Tables[0].Rows) 12 { 13 string pno = dr[0].ToString(); 14 SendContent = TitleContent; 15 if (SMSCommonFunc.IsMobilePhone(pno)) 16 { 17 if (TempCheckPhone.IndexOf(pno) == -1) 18 { 19 20 TempCheckPhone += pno + ","; 21 for (int km = 1; km < Colum; km++) 22 { 23 SendContent = SendContent.Replace("FTep" + km.ToString(), dr[km].ToString()); 24 }
按照你拼接FTep的那个字符串,我觉得这个样子应该可以:
SendContent = SendContent.Replace("FTep" + km.ToString(), dr[km].ToString());改为
SendContent = SendContent.Replace("FTep" + km.ToString() + ",", dr[km].ToString() + ",";
加一个“,”进入字符串并没有改变什么啊,比如"FTep1, " "FTep10," 这两个中间的FTep1还是可能被替换啊
@十四: 不会哦,加个这个应该是"FTep1,"被替换,然后“FTep10,”被替换的,你试了?
@念念啊: 试了下的确可以显示正确了,为什么呢,我自己推理了下感觉还是会被替换啊。因为加“,”在是FTep1后面啊,会变成FTep1, 和 FTep10, 为什么就不会替换了,有点搞不懂!
@十四: 那个Replace(参数1,参数2),参数1和参数2都是整体呀,参数1被参数2替换。当我加了逗号后,替换“FTep1,”的时候那么“FTep10,”中并不存在“FTep1,”,所以FTep10就不会被替换到啊。不晓得这样解释明白的不。
太乱了,为啥不把循环写在外面呢
因为要循环取值嘛,怎么会乱呢,excel表格是循环取值的啊
for (int km = 0; km < Colum; km++) { SendContent = SendContent.Replace("FTep" + (km+1).ToString(), dr[km].ToString()); }
@田林九村: km+1的话岂不是无法替代赋值了?
没懂,楼主不能把代码放上来点???
代码放上了!!
不能从后往前替换?
貌似可以试试!
@十四:
或者给FTep后面数字加个东西再去替换。
SendContent = TitleContent;
SendContent =Regex.Replace(SendContent ,@"FTep(\d+)","FTep$1 ");
....
SendContent = SendContent.Replace("FTep" + km.ToString()+" ", dr[km].ToString());
@向往-SONG: 加东西的话,比如"FTep$1, " "FTep$10," 这两个中间的FTep1还是会被替换的吧
@十四:
不会,如下:
"FTep1,FTep10,".Replace("FTep1,","值1");
@向往-SONG: 应该会的,“值1”会把FTep10中的“FTep1”也换成值1这样FTep10的值就变成了“值10”
@十四:
后面还有个逗号啊,你运行下上面代码就知道了。
@念念啊: 试了下的确可以显示正确了,为什么呢,我自己推理了下感觉还是会被替换啊。因为加“,”在是FTep1后面啊,会变成FTep1, 和 FTep10, 为什么就不会替换了,有点搞不懂!
@十四:
“ FTep10,"包含"FTep1,"吗?显然不,可能是你之前看习惯了FTep1和FTep10,再加个逗号眼神还没反应过来哈。。
@向往-SONG: 十分感谢你,这个问题我竟然纠结了3个小时。。我的时间,我的生命被您挽救了!!
原来字符串是什么样子,啥规律, 要替换的新字符串是啥样子,写个例子啊
原字符串是这样FTep+J.tostring()(J是列)要转换成excel中的具体值。 FTep1....FTep10然后后面替换的时候FTep1把FTep10中的FTep1也给换掉了。。
@十四:
楼上的行,如果没有重复的,可以限制每次替换时只替换一次
SendContent = new Regex("FTep" + km.ToString()).Replace(SendContent, dr[km].ToString(), 1, 0);
这样的话,第一次的时候,“值1”会把FTep10中的“FTep1”也换成值1这样FTep10的值就变成了“值10”,而FTep10则没有值了