在.NET中,不调用C++/CLI,进行字符串替换有好几种方法:

1、最常用的,就是String实例.Replace(),但这个不能忽略大小写。

2、System.Text.Regex(Regular Expression正则表达式),大家都估计到它的效率不高,虽然它支持忽略大小写。

3、String.SubString()循环,查找要替换的子字符串的位置,截取,然后字符串相加,大家也估计到,数量少(在codeproject.com上曾有文章讨论过和StringBuilder的临届值是600次)的情况下会比StringBuilder快。

4、跟3一样,唯一区别就是字符累加用StringBuilder,数量少的情况下比字符累加要慢,但过了临届值就要快。

5、引用Microsoft VisualBasic RunTime(Microsoft.VisualBasic.DLL),里面有一个Strings.Replace,效率非常高,其原理就是:Split()再Join(),其中Split支持忽略大小写的秘诀就是调用了System.Globalization.CultureInfo,也就是所谓的国际化,其实要实现字符串的替换代码量不多,但要兼容各种语言(非编程语言,是交流语言),那就得多花几倍的代码了。

6、不想用VB运行库的朋友,可以用Reflector配合Denis Bauer's Reflector.FileDisassembler把Microsoft.VisualBasic.DLL中的Strings的Replace和相关函数抽取出来(C#),然后修补一下就可以单独使用了(我这明显是吃饱了撑着,VB专家装配脑袋指出我这是浪费时间,因为本身Microsoft VisualBasic运行库就包括在.NET Framework中)。

实战

以下是测试代码:
        static void Main(string[] args)
        {
            string segment = "中华aBc共和国";
            string source;
            string pattern = "abc";
            string destination = "人民";
            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();
   
            //regexp
            time = new HiPerfTimer();
            time.Start();
            for (int i = 0; i < count; i++)
            {
                result = Regex.Replace(source, pattern, destination, RegexOptions.IgnoreCase);
            }
            time.Stop();

Console.WriteLine("regexp    =" + time.Duration + ":");

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

Console.WriteLine("vb        =" + time.Duration + ":");

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

Console.WriteLine("vbReplace =" + time.Duration + ":" + result);

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

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

//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.Stop();

Console.WriteLine("substringB=" + time.Duration + ":");

Console.ReadLine();
        }

说明

这个代码演示了上述几种方法:要把字符串"中华aBc共和国"中的"abc"替换为"人民",注意:源子字符串是"aBc",要替换的是"abc",这里目的是要测试不区分大小写。

为了测试效率,我特意先把测试字符串累加1000次,然后循环测试1000次。

结果

以下是测试结果:
regexp      =1.38308285017339 //这是正则表达式,第3快;
vb            =0.525978828344589 //这是引用Microsoft VisualBasic RunTime的,次快;
vbReplace=0.522997341400086 //这就是用reflector改为C#的,最快;
substring  =21.8573638474698 //这是string.substring +,最慢
substringB=14.6346693500287 //这是string.substring StringBuilder,次慢,这里凸现了StringBuilder的速度;

这里仅仅是多次测试中的一次,我没有弄平均,大概数字吧,到底是vb快还是reflector的c#快,差不多...

是否应该使用Microsoft VisualBasic RunTime就见仁见智了。

C#不区分大小写的字符串替换(Replace)函数的更多相关文章

  1. 字符串替换replace方法

    字符串替换replace方法: http://www.w3school.com.cn/jsref/jsref_replace.asp http://www.cnblogs.com/skywang/ar ...

  2. oracle学习笔记:字符串替换 replace、regexp_replace、translate函数

    1.replace 函数 语法:replace(char, search_string, replacement_string) --针对字符串替换 功能: ​ 将char中的字符串替换. ​ 当re ...

  3. PHP字符串替换str_replace()函数4种用法详解

    mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )该函数返回一个字符串 ...

  4. Python3字符串替换replace(),translate(),re.sub()

    Python3的字符串替换,这里总结了三个函数,replace()和translate()和re.sub() replace() replace() 方法把字符串中的 old(旧字符串) 替换成 ne ...

  5. C# 字符串替换Replace

    C# 中的石strA.Replace(strB,strC)函数可以实现将strA中的strB替换为strC. 但是容易出错的地方是,这并不是就直接替换好了,此函数的返回值才是替换好的字符串,所以还要要 ...

  6. JQuery字符串替换replace方法

    在日常的js开发中,常常会用到JQuery, 当要把字符串中的内容替换时,如果使用类似C#的string.replace方法,如下 var str='aabbccaa'; str=str.replac ...

  7. C#自定义字符串替换Replace方法

    前一阵遇到一个如标题的算法题,是将原有字符串的某些片段替换成指定的新字符串片段,例如将源字符串:abcdeabcdfbcdefg中的cde替换成12345,得到结果字符串:ab12345abcdfb1 ...

  8. JavaScript字符串替换replace方法

    在日常的js开发中, 当要把字符串中的内容替换时,如果使用类似C#的string.replace方法,如下 var str='aabbccaa'; str=str.replace('aa','dd') ...

  9. Java之字符串替换replace()

    replace(char oldChar, char newChar)返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的 import java.uti ...

随机推荐

  1. idea 使用在java 包下的ftl、xml 文件编译问题

    问题 使用ftl 时报错出现ftl 文件找不到,后发现idea未编译java 下的ftl文件 解决方法一 手动编译,复制ftl的文件夹在classes下应该在的地方 解决方法二 pom.xml中加入 ...

  2. Vue 路由守卫解决页面退出和弹窗的显示冲突

    在使用UI框架提供的弹出层Popup时,如Vant UI的popup,在弹出层显示时,点击物理按键或者小程序自带的返回时,会直接退出页面,这明显不符合页面逻辑. 解决思路: 在弹出层显示时,点击了返回 ...

  3. Beta:凡事预则立

    课程名称:软件工程1916|W(福州大学) 作业要求:项目Beta冲刺) 团队名称:葫芦娃队 作业目标:尽力完成 团队博客 队员学号 队员昵称 博客地址 041602421 der himmel ht ...

  4. 2019-2020-1 20199301《Linux内核原理与分析》第九周作业

    第八章 进程的切换和系统的一般执行过程 进程的调度实际与进程的切换 ntel定义的中断类型 硬中断:就是CPU的两根引脚(可屏蔽中断和不可屏蔽中断) 软中断/异常:包括除零错误.系统调用.调试断点等在 ...

  5. Linux中在vim/vi模式下对文本的查找和替换

    查找: 1.vim  filename  进入一般模式下 2.查找和替换方法 /word    向下查找word 的字符串  例如  /chengtingting   向下查找字符chengtingt ...

  6. AOP_原理

    什么是AOPAOP(Aspect-OrientedProgramming,面向方面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善.OOP引入封 ...

  7. apache commons-configuration包读取配置文件

    1.pom依赖添加 <!-- 配置文件读取 --> <dependency> <groupId>commons-configuration</groupId& ...

  8. hdu4767 Bell——求第n项贝尔数

    题意 设第 $n$ 个Bell数为 $B_n$,求 $B_n \ mod  \ 95041567$.($1 \leq  n  \leq  2^{31}$) 分析 贝尔数的概念和性质,维基百科上有,这里 ...

  9. circus 做为批处理的守护进程

    circus 是集成了zeromq,使用python编写的一个进程以及socket 管理工具,使用circus 的进程管理,我们可以用来进行批任务的 处理,同时又能保证任务的准确 项目使用docker ...

  10. (浙江金华)Day 1 组合数计数

    目录 Day 1 组合计数 1.组合数 (1).C(n,m) 读作n选m,二项式系数 : (2).n个东西里选m个的方案数 不关心选的顺序: (3).二项式系数--->多项式系数: 2.组合数计 ...