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

1:使用String.Replace函数替换,但不支持大小写。

2:正则System.Text.Regex替换,用RegExpOption修改是否支持大小写。

3:在小数据的情况下,使用String.SubString和+可以实现间接替换。

4:导入MicrosoftVisualBasicRunTime(Microsoft.VisualBasic.DLL)使用Strings.Replace速度很快。

5:参照反射Reflector.FileDisassembler配合Strings.SplitandStrings.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.Stop();

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

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

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

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

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

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

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索引。赋值。。。判断,返回。

时间: 2024-10-22 22:35:25

.NET中字符串替换的五种方法的相关文章

在asp.NET中字符串替换的五种方法第1/2页_实用技巧

1:使用String.Replace函数替换,但不支持大小写. 2:正则System.Text.Regex替换,用RegExpOption修改是否支持大小写. 3:在小数据的情况下,使用String.SubString和+可以实现间接替换. 4:导入MicrosoftVisualBasicRunTime(Microsoft.VisualBasic.DLL)使用Strings.Replace速度很快. 5:参照反射Reflector.FileDisassembler配合Strings.Splita

python字符串替换的2种方法_python

python 字符串替换 是python 操作字符串的时候经常会碰到的问题,这里简单介绍下字符串替换方法. python 字符串替换可以用2种方法实现: 1是用字符串本身的方法. 2用正则来替换字符串 下面用个例子来实验下: a = 'hello word' 把a字符串里的word替换为python 1.用字符串本身的replace方法 复制代码 代码如下: a.replace('word','python') 输出的结果是hello python 2.用正则表达式来完成替换: 复制代码 代码如

C++ 字符串的反转五种方法实例_C 语言

复制代码 代码如下: //通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识/*分析过程: 假设要使传递的字符串为常量const字符串,这样操作更加灵活,可直接传递字符串字面值进行反转,常见的解决方法就是,定义一个新的与传递过来字符串长度 相等的字符数组,然后进行字符串拷贝,把str字符按从左到右放置到字符数组中,然后采用循环来对字符数组中字符反转*//*第一种,采用以上思路解法,传递为const类型C风格字符指针,返回为char*类型*///直接使用字符数组赋值ch

sqlserver2008中字符替换了几种方法

 代码如下 复制代码 1.select substring(P_NO,2,6) from PEAMAIN 截取表PEAMAIN中的p_no字段中的第2个到第6个中的字符,比如p_no字段中的值为B00001,它将截取的值为000001. sql语句中的字符串的索引是1开始的不是从0开始的.    代码如下 复制代码 2.declare @onece varchar(1)  set @onece =(select substring(P_NO,1,1) from PEAMAIN)    selec

Linux 中清空或删除大文件内容的五种方法_Linux

在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何Linux命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清空文件内容的方法. 注意: 由于再Linux中一切皆文件,你需要时刻注意,确保你将要清空的文件不是重要的用户文件或者系统文件.清空重要的系统文件或者配置文件可能会引发严重的应用失败或者系统错误. 提示:在下面的示例中,我们将使用名为 access.log 的文件来作为示例样本. 1. 通过重定向到 Nul

在Word文档中快速插入日期的五种方法

  在Word文档中快速插入日期的五种方法          方法1:使用"插入"选项卡中的"日期和时间"功能插入当前系统日期. 在"插入"选项卡的"文本"选项组中单击[日期和时间]按钮,打开"日期和时间"对话框,在"可用格式"列表框中选择用户想要的格式,如图1所示.如果用户希望每次打开Word时都自动更新时间,可同时选中"自动更新"复选框. 图1 打开"时

Win7中U盘无法停止“通用卷”的五种方法

  平常在使用完U盘以后都得小心翼翼的检查是否相关程序已经关闭,免得在安全删除U盘时,大家又会遇到那个熟悉得不能再熟悉的讨厌的提示"无法停止'通用卷'设备,请稍候再停止该设备." 从网络上整理了一共5种解决方案,有简单也有稍微繁琐的,不过只要是能最终解决问题,过程有时候真的不那么重要,但不过来反过来一想,过程也是一个学习的经历,不能说这个方法不管用,下次就没必要使用了,每一个人的电脑环境不同,产生问题及其解决方案也会不同,成长自己,帮助他人也未尝不可. 第一种方法: 往往我们在把U盘的

网络营销中优化实时搜索的五种方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 自从去年GOOGLE推出实时搜索以来,实时搜索的这一概念已经被更多的人关注.今天,实时搜索是在为所有主要的搜索引擎列入首要任务 – GOOGLE,BING和YAHOO等.作为新技术的一部分,google同时也跟TWRITE等合作,把与关键词相关的新闻与博客内容放在搜索排名的首 页!对于网络搜索而言,实时搜索能够快速的让使用者了解相关的重要事件

施宇宁:分享解决网站用户粘稠度的五种方法

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 网站的用户粘稠度一直长期困扰着各位站长,站长们都希望自己的网站能留住客户,增加自己的资源.那么我们应该怎么去做才能增加网站用户的粘稠度,留住客户呢?首先来分析下都有哪些人群访问我们的网站.一类人群是临时有需要帮助的人,他们通过百度或是谷歌搜索到我们的网站,从而对网站进行访问.例如,有需要搬家的人去搜索搬家公司,寻求搬家服务. 另一类人群是经常