9

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

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

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

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

但是当d的值为:

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

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

4

3 回答 3

18

那是因为:

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 值,因此运行速度更快。

于 2013-05-07T06:48:35.660 回答
4

您可以使用Regex.Replace()

string _txt = "----------";
_txt = Regex.Replace(_txt, @"\-{2,}", "-");

这将输出:-

于 2013-05-07T06:40:50.627 回答
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();
}

两个循环之间的区别在于,虽然它们可能看起来相同,但第二个循环实际上使用不同的 Unicode 字符作为连IndexOf字符Replace

查看 MSDN 文档:

所以区别在于文化不敏感文化敏感

于 2013-05-07T06:51:27.810 回答