福彩内蒙古时时彩开奖结果 内蒙古时时彩单式上传 内蒙古时时彩结果查询 内蒙古时时彩软件 内蒙古时时彩500走势图 内蒙古时时彩五码走势怎么看 内蒙古时时彩直播开奖 内蒙古时时彩计划软件 内蒙古时时彩五星图 内蒙古时时彩预测最准 内蒙古时时彩三星玩法 彩票内蒙古时时彩 内蒙古时时彩怎么兑奖 内蒙古时时彩软件手机版 内蒙古时时彩现场直播开奖记录 内蒙古时时彩彩票控 内蒙古时时彩快三开奖 内蒙古时时彩计划软件 彩票内蒙古时时彩 内蒙古时时彩最快开奖 福彩内蒙古时时彩 内蒙古时时彩走势图彩经 内蒙古时时彩历史开奖号码查询 内蒙古时时彩5个号走势 内蒙古时时彩wifi 内蒙古时时彩单式 内蒙古时时彩开奖现场报码 内蒙古时时彩五星走势图 内蒙古时时彩最新开奖结果查询 内蒙古时时彩奖金 内蒙古时时彩计划软件手机版 360彩票内蒙古时时彩 内蒙古时时彩软件手机版 内蒙古时时彩11选5开奖结果 内蒙古时时彩最新开奖号码 内蒙古时时彩走势图彩 内蒙古时时彩11走势图 内蒙古时时彩玩法说明 内蒙古时时彩现场直播 内蒙古时时彩官网平台 内蒙古时时彩玩法规则 内蒙古时时彩平台网址 内蒙古时时彩中奖规则 内蒙古时时彩走势图彩经 内蒙古时时彩奖金对 内蒙古时时彩形态走 内蒙古时时彩奖金 内蒙古时时彩历史开奖记录查询 内蒙古时时彩稳赚 今日内蒙古时时彩

IT职业教育

华中地区北大青鸟校区IT集训营

027-87807717

北大青鸟首页 > 热门IT技术教程 > .Net技术教程 > > 在.NET中字符串替换的五种方法

在.NET中字符串替换的五种方法

时间:2012-01-14 10:50 来源:北大青鸟武汉宏鹏鲁广校区作者:admin
导读:武汉北大青鸟鲁广校区.NET技术 1:使用String.Replace函数替换,但不支持大小写。 2:正则System.Text.Regex替换,用RegExpOption修改是否支持大小写。 3:在小数据的情况下,使用String.SubString和
    武汉北大青鸟鲁广校区.NET技术
1:使用String.Replace函数替换,但不支持大小写。
2:正则System.Text.Regex 替换,用RegExpOption修改是否支持大小写。
3:在小数据的情况下,使用String.SubString 和+可以实现间接替换。
4:导入Microsoft Visual Basic RunTime (Microsoft.VisualBasic.DLL) 使用Strings.Replace速度很快。
5:参照反射Reflector.FileDisassembler配合Strings.Split and Strings.Join 等实现,速度同5。

一下介绍一种算法,类似KMP算法。有兴趣的参照研究下。

private static string ReplaceEx(string original, 
                    string pattern, string replacement)
{
    int count, position0, position1;
    count = position0 = position1 = 0;
    string upperString = original.ToUpper();
    string upperPattern = pattern.ToUpper();
    int inc = (original.Length/pattern.Length) * 
              (replacement.Length-pattern.Length);
    char [] chars = new char[original.Length + Math.Max(0, inc)];
    while( (position1 = upperString.IndexOf(upperPattern, 
                                      position0)) != -1 )
    {
        for ( int i=position0 ; i < position1 ; ++i )
            chars[count++] = original[i];
        for ( int i=0 ; i < replacement.Length ; ++i )
            chars[count++] = replacement[i];
        position0 = position1+pattern.Length;
    }
    if ( position0 == 0 ) return original;
    for ( int i=position0 ; i < original.Length ; ++i )
        chars[count++] = original[i];
    return new string(chars, 0, count);
}

测试

static void Main(string[] args)
{
    string segment = "AaBbCc";
    string source;
    string pattern = "AbC";
    string destination = "Some";
    string result = "";
    
    const long count = 1000;
    StringBuilder pressure = new StringBuilder();
    HiPerfTimer time;

    for (int i = 0; i < count; i++)
    {
        pressure.Append(segment);
    }
    source = pressure.ToString();
    GC.Collect();

    //regexp
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = Regex.Replace(source, pattern, 
                  destination, RegexOptions.IgnoreCase);
    }
    time.S();

    Console.WriteLine("regexp    = " + time.Duration + "s");
    GC.Collect();

    //vb
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = Strings.Replace(source, pattern, 
                   destination, 1, -1, CompareMethod.Text);
    }
    time.S();

    Console.WriteLine("vb        = " + time.Duration + "s");
    GC.Collect();


    //vbReplace
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = VBString.Replace(source, pattern, 
                   destination, 1, -1, StringCompareMethod.Text);
    }
    time.S();

    Console.WriteLine("vbReplace = " + time.Duration + "s");// + result);
    GC.Collect();


    // ReplaceEx
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = Test.ReplaceEx(source, pattern, destination);
    }
    time.S();

    Console.WriteLine("ReplaceEx = " + time.Duration + "s");
    GC.Collect();


    // Replace
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = source.Replace(pattern.ToLower(), destination);
    }
    time.S();

    Console.WriteLine("Replace   = " + time.Duration + "s");
    GC.Collect();


    //sorry, two slow :(
    /*//substring
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = StringHelper.ReplaceText(source, pattern, 
                   destination, StringHelper.CompareMethods.Text);
    }
    time.S();

    Console.WriteLine("substring =" + time.Duration + ":");
    GC.Collect();


    //substring with stringbuilder
    time = new HiPerfTimer();
    time.Start();
    for (int i = 0; i < count; i++)
    {
        result = StringHelper.ReplaceTextB(source, pattern, 
                    destination, StringHelper.CompareMethods.Text);
    }
    time.S();

    Console.WriteLine("substringB=" + time.Duration + ":");
    GC.Collect();
    */

    Console.ReadLine();
}

1¡¢string segment = "abcaBc";
regexp = 3.75481827997692s
vb = 1.52745502570857s
vbReplace = 1.46234256029747s
ReplaceEx = 0.797071415501132s !!!<FONT color=gray>Replace = 0.178327413120941s </FONT>
// ReplaceEx > vbReplace > vb > regexp

2¡¢string segment = "abcaBcabC";
regexp = 5.30117431126023s
vb = 2.46258449048692s
vbReplace = 2.5018721653171s
ReplaceEx = 1.00662179131705s !!!
<FONT color=gray>Replace = 0.233760994763301s </FONT>
// ReplaceEx > vb > vbReplace > regexp

3¡¢string segment = "abcaBcabCAbc";
regexp = 7.00987862982586s
vb = 3.61050301085753s
vbReplace = 3.42324876485699s
ReplaceEx = 1.14969947297771s !!!
<FONT color=gray>Replace = 0.277254511397398s </FONT>
// ReplaceEx > vbReplace > vb > regexp

4¡¢string segment = "ABCabcAbCaBcAbcabCABCAbcaBC";
regexp = 13.5940090151123s
vb = 11.6806222578568s
vbReplace = 11.1757614445411s
ReplaceEx = 1.70264153684337s !!!(my god!)
<FONT color=gray>Replace = 0.42236820601501s</FONT>
// ReplaceEx > vbReplace > vb > regexp

查看程序的Block在:

 
string upperString = original.ToUpper();
string upperPattern = pattern.ToUpper();

如果需要敏?#26657;?#23601;免了这2?#23567;?br />
解释?#21512;?#24314;一个char[]类型的变量采访替换后的字符,其大小就是较大可能被替换的字符,例如ABABAB,替换AB成C,其获取过程就是ABABAB较大可能包括的AB的数目乘以AB多于C的数目,
char [] chars = new char[original.Length + Math.Max(0, inc)];
inc不一定大于零。
然后循环,用IndexOf索引。?#25345;怠!!?#21028;断,返回。
告诉我们,你现在想了解什么?

精?#39318;?#39064;——96%的同学看到这里都会点击下面的专题

  • 关于我们
  • 鲁广校区北大青鸟宏鹏IT学院

    • 北大青鸟(武汉宏鹏)鲁广北校区地址:武汉市洪山区珞瑜路724号地铁二号线光谷广场E出口
      电话:027-87807717
      网址:www.027hpit.com

    • 北大青鸟宏鹏IT学院:武汉市洪山区鲁磨路568号
      电话:027-87808818
      网址:www.accp027.com

    • 北大青鸟(武汉宏鹏)鲁广南校区:武汉市洪山区珞瑜路724号武汉数码港五楼
      电话:027-87807736
      网址:www.whhpit.com

Copyright (c) 2006-2020 武汉宏鹏教育咨询有限公司 版权所有 All Rights Reserved.

内蒙古时时彩开奖现场