<dd id="dujzp"><noscript id="dujzp"></noscript></dd>
    <progress id="dujzp"><track id="dujzp"></track></progress>
    1. 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();

      如果需要敏感,就免了这2行。

      解释:先建一个char[]类型的变量采访替换后的字符,其大小就是较大可能被替换的字符,例如ABABAB,替换AB成C,其获取过程就是ABABAB较大可能包括的AB的数目乘以AB多于C的数目,
      char [] chars = new char[original.Length + Math.Max(0, inc)];
      inc不一定大于零。
      然后循环,用IndexOf索引。赋值。。。判断,返回。
      告诉我们,你现在想了解什么?

      精彩专题——96%的同学看到这里都会点击下面的专题

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

      彩图诗句 <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>