delphi 截取字符串字符处理

一、几个字符串处理的基本函数
&& a)子串定位&&获取子串在原字串中的位置(不是数组下标,而是第几个)&
1 function pos('子串','原字符串'):integer
&&& 说明:当有中文时,最好这样用:pos('子串',wideString('原字符串')),这样可以避免前一个汉字的后半部分和后一个汉字的前半部分 也恰好能构成一个汉字时出现问题。
& b)子串截取&&拷贝出原字符串中的部分子串(Index不是数组下标,而是第几个)
1 function Copy(S; Index, Count: Integer):string
说明:其实该函数也可对字符数组进行拷贝操作,只不过&源数据&和&返回数据&都是字符数组
&&&&&&& & && function Copy(S; Index, Count: Integer):array
&&& 附:另几个更有针对性的截取操作
&& & & & & 1)截取源字符串左端一定长度位数:StrUtils.pas&&&&&&&&&&&&&&&& function LeftStr(Const Str:SSize:word):&&&&&&&&&& 2)截取源字符串中间一定长度位数:StrUtils.pas&&&&&&&&&&&&&&&& function MidStr(Const Str:SFrom,Size:word):&&&&&&&&&& 3)截取源字符串右端一定长度位数:StrUtils.pas&&&&&&&&&&&&&&&& function RightStr(Const Str:SSize:word):
&& c)字符串分割&&利用分割符将原串分割成若干个子串
1 strList:=TStringList.2 strList.delimiter:='|';3 strList.delimitedText:='待|分|割|的|字|符|串';
&&& 说明:& 这样操作之后,分割得到的每条元素都分别存于strList中
&& d)长度计算&&计算字符串的长度
&function Length(S): I
&& e)长度设定&&人为指定字符串的长度
&procedure SetLength(var S; NewLength: Integer);
&&& 字符串显示时,会根据设置的长度值而不是后面的结束符#0,来决定显示的&字符长度&
&& f)字符串填充
&var& SourceString,ResultString:string;&begin& SourceString:='ABCD';& //ResultString为8位,不足高位用&0&填充& ResultString:=StringOfChar('0',8-length(SourceString))+& ShowMessage(ResultString);//最终结果为&0000ABCD& &end;
&&& 说明:对位数不足的字符串,在高位置以特定的字符进行填充
&& g)字符串中添加分隔符(自定义函数)
function DelimiterInsert(Const s: S Const sCut: String): S
while i & length(s) do
if i = 1 then
Result := copy(s, i, 2)
Result := Result + sCut+ Copy(s, i, 2);
i := i + 2;
&&&& 测试:
sourceStr,destinateStr:string;
sourceStr:='abcdefgh';
destinateStr := DelimiterInsert(sourceStr, '-');//每两个字符之间加上&-&
ShowMessage(destinateStr);
&&& 运行结果:
& h)单引号
&&&& aa := 'aaa''' ;那么aa的结果就是aaa' &&& 实际上就是两个单引号表示一个单引号& bb:='bb''bb';bb的结果为 bb'bb
& i)ascii码转换成字符
ss:string;
ss:=char(65)+char(66);
ShowMessage(ss);
&&& 运行结果:
&& j)字符替换
ss:string;
ss:='aaabbbccc';
ss:=StringReplace(ss, 'b', 'm', [rfReplaceAll]);
ShowMessage(ss);
&&& 运行结果:
注:&更全面的字符串处理函数,可参考:
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& a)&&&&&&&&&&&&& & & & & & & & & & & & & & & b)Delphi帮助文档,Help&&Delphi Help 下strUtils&
二、string,pchar,字符数组三者之间的相互转换 &
a)String类型在内存中的分配
&&&&&& 说明:1)结束符#0其实只是为了兼容pchar类型,实际输出字符串时,是根据&字符串长度&中存储的数值,而不是结束符#0,代码如下:
varSrcString:string;begin
SrcString:='12345';//此时长度为5
ShowMessage('原始字符串为:'+SrcString);
SrcString:=SrcString+'AddStr';
//此时字符串为&12345AddStr&,长度也会自动修改为11
showmessage('追加之后的字符串:'+SrcString); //显示为:&12345AddStr&
SetLength(SrcString,3);
//字符串长度人为设置为3,实际长度应该是11
ShowMessage('人为设置长度后字符串为:'+SrcString);//根据存储的长度值显 示,而非结束符#0,最终输出&123&end;
&&&&&&&&&&&&&&& 2)引用计数的作用是:当指向该堆空间的指针个数为零时,编译器自动释放堆内存,而不需
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 要手动释放
&&&&&&&&& & && 3)采用copy on write机制,以提高内存空间的利用率
&&&&& 附:什么是copy on write机制?
& & & & & & 多个引用指向同一块内存地址。当其中的某个引用发生写操作时,重新拷贝一份到其他内存中,同时
&&&&&& 原引用计数减1。这样做是为了提高内存的利用率。
&&&&&&&&&&& 缺陷:string类型作为参数时,尽管一开始&临时引用&和&原始引用&都指向堆中的同一块内存,
&&&&&&&&&&&&&&&&&&&&& 当在调用到的函数体内,对&临时引用&指向的内存块进行写操作时,实际上会把该内存块
&&&&&&&&&&&&&&&&&&&&& 的内容拷贝出来并结合具体的操作,生成调用者需要的字符串,存入新开辟的一块堆内存中,
&&&&&&&&&&&&&&&&&&&&& 此时&原始引用&指向的那块内存块的内容并没有发生改变,这也是为什么无法用string类型
&&&&&&&&&&&&&&&&&&&&&&作为输出参数传递函数返回值(但可以用作输入参数),而是使用PChar类型作为输出参数
&&&&&&&&&&&&&&&&&&&&& 传递函数返回值
&&&&&&&&&&&&&&&&&&&&& 被调用的以string类型作为&输出参数&的函数: &&&&&&&&&
procedure TForm1.StringTypeAsOutputParam(SourceStr:string);begin
SourceStr:=SourceStr+'bbbbb';
showmessage('修改之后的字符串为:'+SourceStr);//显示为:aaaaabbbbbbend;
&&&&&&&&&&&&&&&&&&&&& 调用该函数:
mySourceStr:string;begin
mySourceStr:='aaaaa';
showmessage('原始字符串为:'+mySourceStr); //显示为:'aaaaa'
StringTypeAsOutputParam(mySourceStr); //将string类型作为输出参数传入
showmessage('调用函数之后的字符串为:'+mySourceStr);//依然显示为:'aaaaa'end;
b)String与Pchar
&&& 两者兼容,可直接进行&类型强转&
myString:string; 3
myPchar:PC 4 &begin 5
myString:='ABCDEFG'; 6
ShowMessage('转换之前的字符串为:'+myString);
//此时字符串为 &ABCDEF& 7
myPchar:=PChar(myString); 8
mystring:=string(myPchar); 9
ShowMessage('连续转换后的字符串为:'+myString); //此时字符串仍为 &ABCDEF&10 &end;
c)字符数组与Pchar
&& 1)字符数组下标从0开始
&& 2)字符数组下标从1开始
var& myArrayChar:array[1..10] of C& myPchar:PCbegin& myPchar:=PChar('ABCDEF');& StrCopy(@myArrayChar,myPchar);
// 也可使用
StrPCopy(@myArrayChar,'ABCDEF');& ShowMessage(myArrayChar[1]); //输出值为 &A&
注:此时若以myArrayChar[0]来访问会无法通过编译& myArrayChar[1]:='1';& myPchar:=PChar(@myArrayChar);& ShowMessage(string(myPchar)); //整个字符串为&1BCDEF&end;
d)string与字符数组 :需要借助pchar类型过渡
myString:string; 3
myArrayChar:array[1..10] of C 4begin 5
myString:='ABCDEF'; 6
StrCopy(@myArraychar,PChar(myString));//也可以使用 StrPCopy(@myArraychar,myString); 7
myArrayChar[1]:='1'; 8
myString:=string(PChar(@myArrayChar)); 9
ShowMessage(myString);
//转换后的值为&1BCDEF&10end;
注: StrCopy与StrPCopy的区别
&&&& 参数类型:&&& StrCopy(pchar类型,pchar类型);
&&&&&&&&&&&&&&&&&&&&& StrPCopy(pchar类型,string类型);
e)推荐用法:
&&& 1)字符串拷贝时
&&&&&&&&&&& StrPCopy(pchar类型,string类型);
&&& 2)需要将字符串作为&输出参数&时
&&&&&&&&&&& 使用PChar类型
&&& 3)定义字符数组时
&&&&&&&&&&& charArray:array[0..n]//下标尽可能从0开始,而不是从1开始
f)string与widestring&
&& string: Ansi字符集&& widestring: Unicode字符集
阅读(...) 评论()2004年10月 Web 开发大版内专家分月排行榜第二
2004年1月 Web 开发大版内专家分月排行榜第三2003年12月 Web 开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。5940人阅读
Delphi(29)
在Delphi中一个汉字占两个字节,各种字符串处理函数,直接处理字符串中汉字时经常会发生乱码或不显示。我在处理时也是弄了半天,到处找资料,一下是找到的几种处理方法。在Delphi7下测试通过。
一.中文所用的字符全是双字节字符,英文所用的字节全是单字节字符,也就是mbSingleByte。本实例是用ByteType()函数返回字符串指定位置上的字符,如果不是mbSingleByte,则表示为双字节字符。主要代码如下:
&procedure TForm1.Button1Click(Sender: TObject); &&&&var &&&&&s,s1: S &&&&&i : I &&&&begin &&&&&s := Edit1.T &&&&&i := 0; &&&&&while i&Length(s) do &&&&&begin &&&&& if (ByteType(S,i) && mbSingleByte) then &&&&& begin &&&&&& s1 := s1+ Copy(s,i,2)+' '; &&&&&& i := i+2; &&&&& end &&&&& else &&&&&& i:= i+1; &&&&& &&&&&Label2.Caption := Trim(s1); &&&&
二.本实例是用Length()函数来获取字符串的长度,用Ord()函数来获取每个字符的ASCII码,当ASCII码的值大于$7F时,表示该字符是汉字的前一个字节,并用Copy()函数来获取当前的汉字。主要代码如下:
procedure TForm1.Button2Click(Sender: TObject);&var&&&& str,s,sj: S&&&& i:&&& begin&&&& str := trim(Edit1.Text);&&&& i := 0;&&&& while i& Length(str) do&&&& begin&&&&& if ord(str[i]) & $7F then&&&&& begin&&&&&& s := Copy(str,i,2);&&&&&& sj :=sj+ '"'+s+'"';&&&&&& i := i+2;&&&&& end&&&&& else& i:=i+1;&&&&&&&& Label2.Caption := '在字符串中含有汉字'+&&&三用widestring类型。widestring处理汉字时汉字按一个字符算。代码如下:
procedure TForm1.Button3Click(Sender: TObject);var& str:& badword,filtstr:& filtcount,i:& msg:&begin& msg:=edit1.T& for i:=1 to length(msg) do&& begin&&&& if Pos((msg[i]),filtstr)&&0 then&&&&&&& begin&&&&&&&&& badword:=badword+msg[i]+',';&&&&&&&&& msg:=StringReplace(msg,msg[i],'*', []);&&&&&&&&& filtcount:=filtcount+1;&&&&&&&&&&& showmessage(msg);&
四.用Windows.IsDBCSLeadByte函数处理。详细使用见博文.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:153268次
积分:1752
积分:1752
排名:第19055名
原创:29篇
转载:12篇
评论:26条
(1)(1)(1)(1)(1)(1)(1)(2)(1)(2)(1)(1)(3)(2)(1)(1)(1)(1)(2)(5)(6)(1)(4)delphi里,字符串与日期格式的转化 - 注重长远 天天积累 cqujsjcyj - ITeye技术网站
博客分类:
delphi里,字符串与日期格式的转化
1. string-&datetime
shortdatetime
'yyyy-mm-dd'
strtodatetime('
11:11:00')
2. datetime-&string
formatdatetime('yyyy-mm-dd
在SQL Server 数据库里,select getdate() as serverdatetime 得到系统时间;
浏览: 1442536 次
来自: 厦门
可以,学习了~~
frxrprt1.PreviewForm.Pare ...
我也有这个疑问,非常 感 谢
学习了,高效读书
非常感谢分享!}

我要回帖

更多关于 delphi 字符串 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信