1. <form id="hid2f"><legend id="hid2f"></legend></form><form id="hid2f"><legend id="hid2f"></legend></form>
              <sub id="hid2f"><big id="hid2f"><td id="hid2f"></td></big></sub>

                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.

                赛马会