打造Delphi中字符串的replace函数

原创 2003年07月31日 09:36:00

打造Delphi中字符串的replace函数<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

编者注:其实Delphi的StringReplace函数就是专为满足这个需要而设的。但我们也将这篇文章发表出来——至少作者提供了一种替代方案,探索精神应该鼓励!

 

   这是小弟在这里的第一篇文章,加之自己水平也不是很高,就来讨论一个基础但是很实用的问题吧,希望能给大家一些帮助。

   用过vb的或asp的朋友都知道,在vb里有一个很实用的replace函数,它的功能是把一个字符串中与子串(又叫模式串)相匹配的串替换为指定的串。举个例子来说有这样一个字符串:s:=’apple is apple!’ ,用replace函数replace(s,’apple’,’box’)后,s就变为’box is box!’。串的长度也相应改变了。这是一个很有用的函数,大家都知道在开发数据库系统时会经常用到结构化查询语句sql,而这个语句中对有些字符是比较敏感的,比如说单引号,如果在sql语句中出现单引号(因为单引号是在sql中规定的一个有意义的字符)程序就会出现意想不到的错误,甚至可以被他人利用使系统产生严重安全漏洞(这就是著名的sql注入式攻击,相信大家还记得以前csdn论坛曾发现的这个漏洞吧)。这时你就需要在数据库操作时候将单引号替换为其他的字符串或空串,在读出数据的时候再替换回来,这样数据记录中就可以记录单引号,而不发生错误了。

   然而,我在delphi中却没有发现类似的函数(或许是我没找到?),实在是很不方便,于是自己写了一个,在以后的数据库系统开发中就方便多了。说了那么多废话,下面是代码,加上注释应该比较容易理解。

 

procedure replace(var s:string;const SourceChar:pchar;const RChar:pchar);

//第一个参数是原串,第二个是模式串,第三个是替换串

var

 ta,i,j:integer;

 m,n,pn,sn:integer;

 SLen,SCLen,RCLen:integer;//SLen表示原串的长度,SCLen表示模式传的长度,RCLen表示替换串的长度

 IsSame:integer;

 newp:array of char;//用来保存替换后的字符数组

begin

 SLen:=strlen(pchar(s));SCLen:=strlen(SourceChar);RCLen:=strlen(RChar);

 j:=pos(string(SourceChar),s);

 s:=s+chr(0);ta:=0;i:=j;

 while s[i]<>chr(0) do   //这个循环用ta统计模式串在原串中出现的次数

 begin

   n:=0;IsSame:=1;

   for m:=i to i+SCLen-1 do

   begin

    if m>SLen then begin IsSame:=0;break; end;

    if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;

    n:=n+1;

   end;

   if IsSame=1 then begin ta:=ta+1;i:=m; end else i:=i+1;

 end;

 if j>0 then

 begin

  pn:=0;sn:=1;

  setlength(newp,SLen-ta*SCLen+ta*RCLen+1);//分配newp的长度,+1表示后面还有一个#0结束符

  while s[sn]<>chr(0) do //主要循环,开始替换

  begin

   n:=0;IsSame:=1;

   for m:=sn to sn+SCLen-1 do //比较子串是否和模式串相同

   begin

    if m>SLen then begin IsSame:=0;break; end;

    if s[m]<>sourceChar[n] then begin IsSame:=0;break; end;

    n:=n+1;

   end;

   if IsSame=1 then//相同

   begin

    for m:=0 to RCLen-1 do

    begin

     newp[pn]:=RChar[m];pn:=pn+1;

    end;

    sn:=sn+SCLen;

   end

   else

   begin //不同

    newp[pn]:=s[sn];

    pn:=pn+1;sn:=sn+1;

   end;

  end;

  newp[pn]:=#0;

  s:=string(newp); //重置s,替换完成!

 end;

end;

 

   其实这是一个基础的数据结构问题,在经常拖放控件编程的今天就全当练习数据结构吧。当然这个函数写的不是最优的,我测试了一下替换一万字的字符串,要半秒种的时间,时间复杂度还是比较高,如果各位有更优的办法,欢迎讨论!

C++ STL replace()函数常用用法详解

replace算法:                 replace函数包含于头文件#include中。               泛型算法replace把队列中与给定值相等的所有值替换为另一个...
  • zwj1452267376
  • zwj1452267376
  • 2015年07月09日 20:49
  • 9182

c语言之strreplace字符串替换

#include #include #include //https://github.com/ssllab/temper1/blob/722991add4a6a239271e1f029ebe...
  • earbao
  • earbao
  • 2016年06月29日 22:51
  • 2750

js的字符串替换函数replace

最近用js写了一个模板替换的函数,传入一个对象和一个模板字符串,将模板中对应的变量替换成对应的值,这个功能很简单,遍历一下对象,然后使用js自带的replace函数进行替换,写好后,一开始觉得挺好用的...
  • u013160932
  • u013160932
  • 2015年10月21日 21:35
  • 2266

实现一个replace函数替换掉指定c串中子字符串

基本思路,先扫描source字符串, 记录下所有
  • nodeathphoenix
  • nodeathphoenix
  • 2014年07月19日 11:42
  • 4599

IDL中一个好用的字符串替换的函数replace_string

; ; Copyright (c) 1998, Forschungszentrum Juelich GmbH ICG-1 ; All rights reserved. ; Unauthorize...
  • rumswell
  • rumswell
  • 2011年07月04日 20:52
  • 2705

JavaScript replace字符串替换函数的用法

replace 语法 stringObj.replace(rgExp, replaceText) stringObj  必选项。要执行该替换的 String 对象或文字。该对象不会被 replac...
  • chenwei160803
  • chenwei160803
  • 2011年11月22日 14:13
  • 45229

java中String字符串的替换函数:replace与replaceAll的区别

java中String字符串的替换函数:replace与replaceAll的区别
  • educast
  • educast
  • 2016年06月05日 15:54
  • 1497

python常用的几种字符串替换函数strip、replace、sub

今天在做一道今年秋季招聘题目的时候遇上了一个替换的问题,题目看起来好长好复杂啊,真的,一时间,我看了好几遍也没看懂,其实实质很简单,就是需要把给定的一个字符串里面的指定字符替换成一些指定的内容就行了,...
  • Together_CZ
  • Together_CZ
  • 2017年04月14日 14:50
  • 4673

javascript中字符串替换函数replace()方法详解

javascript中字符串替换函数replace()方法详解 在javascript中,String的函数replace()简直太让人喜爱了。它灵活而强大的字符替换处理能力,让我不禁...
  • lionzl
  • lionzl
  • 2011年06月15日 08:57
  • 583

linux c语言字符串函数replace,indexOf,substring等的实现(转)

原文地址::http://www.cnblogs.com/qq78292959/archive/2012/05/04/2483049.html c语言没有像java那么丰富的字符串操...
  • xqhrs232
  • xqhrs232
  • 2017年03月22日 17:24
  • 428
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:打造Delphi中字符串的replace函数
举报原因:
原因补充:

(最多只允许输入30个字)