String.Replace无法正常工作

时间:2013-05-07 06:36:35

标签: c# replace

这很奇怪,因为我已经使用了Replace功能数千次。这是我的代码:

while (d.IndexOf("--") != -1) d=d.Replace("--", "-");

这是我跟踪时的变量 d 的值:

"آدنیس,اسم دختر,girl name,آدونیس--‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"

但是当 d 的值为:

时它会停滞不前
"آدنیس,اسم دختر,girl name,آدونیس-‌-گلی-به-رنگ-زرد-و-قرمز-که-فقط-هنگام-تابش-خورشید-باز-می-شود"

谁能告诉我为什么? 有趣的是,甚至破折号都是以编程方式添加的。

3 个答案:

答案 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文档:

所以差异是文化不敏感文化敏感