这很奇怪,因为我已经使用了Replace功能数千次。这是我的代码:
while (d.IndexOf("--") != -1) d=d.Replace("--", "-");
这是我跟踪时的变量 d 的值:
"آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"
但是当 d 的值为:
时它会停滞不前"آدنیس,اسم دختر,girl name,آدونیس--گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"
谁能告诉我为什么? 有趣的是,甚至破折号都是以编程方式添加的。
答案 0 :(得分:19)
那是因为:
var d1 = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود";
与此不同:
var d2 = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود";
字符串中的最后三个字符实际上不是unicode -
请亲自尝试:
var d1 = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود";
var d2 = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود";
while (d.IndexOf("--", StringComparison.Ordinal) != -1) d1 = d1.Replace("--", "-");
Console.WriteLine(d1); // the last characters are left
while (d2.IndexOf("--", StringComparison.Ordinal) != -1) d2 = d2.Replace("--", "-");
Console.WriteLine(d2); // All clear
仅供参考: 字符串比较方法indexof是特定于文化的。我会用:
var d = "آدنیس,اسم دختر,girl name,آدونیس---گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود";
while (d.IndexOf("--", System.StringComparison.Ordinal) != -1)
d = d.Replace("--", "-");
因为它使用序数规则,即与文化无关的unicode值,并且运行得更快。
答案 1 :(得分:4)
您可以使用Regex.Replace()
string _txt = "----------";
_txt = Regex.Replace(_txt, @"\-{2,}", "-");
这将输出:-
答案 2 :(得分:3)
我用LinqPad测试了这个 - 很有趣。
// d0 succeeds:
var d0 = "world--life";
while (d0.IndexOf("--") != -1)
{
d0=d0.Replace("--", "-");
d0.Dump();
}
// d1 loops forever
var d1 = "world--life";
while (d1.IndexOf("--") != -1)
{
d1=d1.Replace("--", "-");
d1.Dump();
}
两个循环之间的区别在于虽然它们可能看起来相同,但第二个循环实际上对IndexOf
中的连字符使用不同的Unicode字符与Replace
中的连字符
查看MSDN文档:
IndexOf - http://msdn.microsoft.com/en-us/library/k8b1470s.aspx - This method performs a word (case-sensitive and culture-sensitive) search using the current culture. The search begins at the first character position of this instance and continues until the last character position.
替换 - http://msdn.microsoft.com/en-us/library/fk49wtc1.aspx - This method performs an ordinal (case-sensitive and culture-insensitive) search to find oldValue.
所以差异是文化不敏感与文化敏感