字符串处理.docx
- 文档编号:10635302
- 上传时间:2023-02-22
- 格式:DOCX
- 页数:44
- 大小:39.87KB
字符串处理.docx
《字符串处理.docx》由会员分享,可在线阅读,更多相关《字符串处理.docx(44页珍藏版)》请在冰豆网上搜索。
字符串处理
字符串处理【Delphi版】
一、几个字符串处理的基本函数
a)子串定位——获取子串在原字串中的位置(不是数组下标,而是第几个)
1 function pos('子串','原字符串'):
integer
说明:
当有中文时,最好这样用:
pos('子串',wideString('原字符串')),这样可以避免前一个汉字的后半部分和后一个汉字的前半部分也恰好能构成一个汉字时出现问题。
b)子串截取——拷贝出原字符串中的部分子串(Index不是数组下标,而是第几个)
1 function Copy(S;Index,Count:
Integer):
string
说明:
其实该函数也可对字符数组进行拷贝操作,只不过“源数据”和“返回数据”都是字符数组
functionCopy(S;Index,Count:
Integer):
array
附:
另几个更有针对性的截取操作
1)截取源字符串左端一定长度位数:
StrUtils.pas
functionLeftStr(ConstStr:
String;Size:
word):
string;
2)截取源字符串中间一定长度位数:
StrUtils.pas
functionMidStr(ConstStr:
String;From,Size:
word):
string;
3)截取源字符串右端一定长度位数:
StrUtils.pas
functionRightStr(ConstStr:
String;Size:
word):
string;
c)字符串分割——利用分割符将原串分割成若干个子串
1 strList:
=TStringList.create;
2 strList.delimiter:
='|';
3 strList.delimitedText:
='待|分|割|的|字|符|串';
说明:
这样操作之后,分割得到的每条元素都分别存于strList中
d)长度计算——计算字符串的长度
function Length(S):
Integer;
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))+sourcestring;
ShowMessage(ResultString);//最终结果为‘0000ABCD’
end;
说明:
对位数不足的字符串,在高位置以特定的字符进行填充
g)字符串中添加分隔符(自定义函数)
functionDelimiterInsert(Consts:
String;ConstsCut:
String):
String;
var
i:
Integer;
begin
i:
=1;
whilei begin ifi=1then Result: =copy(s,i,2) else Result: =Result+sCut+Copy(s,i,2); i: =i+2; end; end; 测试: var sourceStr,destinateStr: string; begin sourceStr: ='abcdefgh'; destinateStr: =DelimiterInsert(sourceStr,'-');//每两个字符之间加上“-” ShowMessage(destinateStr); end; 运行结果: h)单引号 aa: ='aaa''';那么aa的结果就是aaa' 实际上就是两个单引号表示一个单引号 bb: ='bb''bb';bb的结果为bb'bb i)ascii码转换成字符 var ss: string; begin ss: =char(65)+char(66); ShowMessage(ss); end; 运行结果: j)字符替换 var ss: string; begin ss: ='aaabbbccc'; ss: =StringReplace(ss,'b','m',[rfReplaceAll]); ShowMessage(ss); end; 运行结果: 注: 更全面的字符串处理函数,可参考: a) b)Delphi帮助文档,Help—>DelphiHelp下strUtils 二、string,pchar,字符数组三者之间的相互转换 a)String类型在内存中的分配 说明: 1)结束符#0其实只是为了兼容pchar类型,实际输出字符串时,是根据“字符串长度”中存储的数值,而不是结束符#0,代码如下: var SrcString: 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)采用copyonwrite机制,以提高内存空间的利用率 附: 什么是copyonwrite机制? 多个引用指向同一块内存地址。 当其中的某个引用发生写操作时,重新拷贝一份到其他内存中,同时 原引用计数减1。 这样做是为了提高内存的利用率。 缺陷: string类型作为参数时,尽管一开始“临时引用”和“原始引用”都指向堆中的同一块内存, 当在调用到的函数体内,对“临时引用”指向的内存块进行写操作时,实际上会把该内存块 的内容拷贝出来并结合具体的操作,生成调用者需要的字符串,存入新开辟的一块堆内存中, 此时“原始引用”指向的那块内存块的内容并没有发生改变,这也是为什么无法用string类型 作为输出参数传递函数返回值(但可以用作输入参数),而是使用PChar类型作为输出参数 传递函数返回值 被调用的以string类型作为“输出参数”的函数: procedureTForm1.StringTypeAsOutputParam(SourceStr: string); begin SourceStr: =SourceStr+'bbbbb'; showmessage('修改之后的字符串为: '+SourceStr);//显示为: aaaaabbbbbb end; 调用该函数: var mySourceStr: string; begin mySourceStr: ='aaaaa'; showmessage('原始字符串为: '+mySourceStr);//显示为: 'aaaaa' StringTypeAsOutputParam(mySourceStr);//将string类型作为输出参数传入 showmessage('调用函数之后的字符串为: '+mySourceStr);//依然显示为: 'aaaaa' end; b)String与Pchar 两者兼容,可直接进行“类型强转” 1 var 2 myString: string; 3 myPchar: PChar; 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 Char; myPchar: PChar; begin 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类型过渡 1var 2 myString: string; 3 myArrayChar: array[1..10] of Char; 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]ofchar;//下标尽可能从0开始,而不是从1开始 f)string与widestring string: Ansi字符集 widestring: Unicode字符集 Delphi 控制Excel (一)使用动态创建的方法 首先创建Excel对象,使用ComObj: varExcelApp: Variant; ExcelApp: =CreateOleObject('Excel.Application'); 1)显示当前窗口: ExcelApp.Visible: =True; 2)更改Excel标题栏: ExcelApp.Caption: ='应用程序调用MicrosoftExcel'; 3)添加新工作簿: ExcelApp.WorkBooks.Add; 4)打开已存在的工作簿: ExcelApp.WorkBooks.Open('C: \Excel\Demo.xls'); 5)设置第2个工作表为活动工作表: ExcelApp.WorkSheets[2].Activate; 或ExcelApp.WorksSheets['Sheet2'].Activate; 6)给单元格赋值: ExcelApp.Cells[1,4].Value: ='第一行第四列'; 7)设置指定列的宽度(单位: 字符个数),以第一列为例: ExcelApp.ActiveSheet.Columns[1].ColumnsWidth: =5; 8)设置指定行的高度(单位: 磅)(1磅=0.035厘米),以第二行为例: ExcelApp.ActiveSheet.Rows[2].RowHeight: =1/0.035;//1厘米 9)在第8行之前插入分页符: ExcelApp.WorkSheets[1].Rows.PageBreak: =1; 10)在第8列之前删除分页符: ExcelApp.ActiveSheet.Columns[4].PageBreak: =0; 11)指定边框线宽度: ExcelApp.ActiveSheet.Range['B3: D4'].Borders[2].Weight: =3; 1-左 2-右 3-顶 4-底 5-斜(\) 6-斜(/) 12)清除第一行第四列单元格公式: ExcelApp.ActiveSheet.Cells[1,4].ClearContents; 13)设置第一行字体属性: ExcelApp.ActiveSheet.Rows[1].Font.Name: ='隶书'; ExcelApp.ActiveSheet.Rows[1].Font.Color : =clBlue; ExcelApp.ActiveSheet.Rows[1].Font.Bold : =True; ExcelApp.ActiveSheet.Rows[1].Font.UnderLine: =True; 14)进行页面设置: a.页眉: ExcelApp.ActiveSheet.PageSetup.CenterHeader: ='报表演示'; b.页脚: ExcelApp.ActiveSheet.PageSetup.CenterFooter: ='第&P页'; c.页眉到顶端边距2cm: ExcelApp.ActiveSheet.PageSetup.HeaderMargin: =2/0.035; d.页脚到底端边距3cm: ExcelApp.ActiveSheet.PageSetup.HeaderMargin: =3/0.035; e.顶边距2cm: ExcelApp.ActiveSheet.PageSetup.TopMargin: =2/0.035; f.底边距2cm: ExcelApp.ActiveSheet.PageSetup.BottomMargin: =2/0.035; g.左边距2cm: ExcelApp.ActiveSheet.PageSetup.LeftMargin: =2/0.035; h.右边距2cm: ExcelApp.ActiveSheet.PageSetup.RightMargin: =2/0.035; i.页面水平居中: ExcelApp.ActiveSheet.PageSetup.CenterHorizontally: =2/0.035; j.页面垂直居中: ExcelApp.ActiveSheet.PageSetup.CenterVertically: =2/0.035; k.打印单元格网线: ExcelApp.ActiveSheet.PageSetup.PrintGridLines: =True; 15)拷贝操作: a.拷贝整个工作表: ExcelApp.ActiveSheet.Used.Range.Copy; b.拷贝指定区域: ExcelApp.ActiveSheet.Range['A1: E2'].Copy; c.从A1位置开始粘贴: ExcelApp.ActiveSheet.Range.['A1'].PasteSpecial; d.从文件尾部开始粘贴: ExcelApp.ActiveSheet.Range.PasteSpecial; 16)插入一行或一列: a.ExcelApp.ActiveSheet.Rows[2].Insert; b.ExcelApp.ActiveSheet.Columns[1].Insert; 17)删除一行或一列: a.ExcelApp.ActiveSheet.Rows[2].Delete; b.ExcelApp.ActiveSheet.Columns[1].Delete; 18)打印预览工作表: ExcelApp.ActiveSheet.PrintPreview; 19)打印输出工作表: ExcelApp.ActiveSheet.PrintOut; 20)工作表保存: ifnotExcelApp.ActiveWorkBook.Savedthen ExcelApp.ActiveSheet.PrintPreview; 21)工作表另存为: ExcelApp.SaveAs('C: \Excel\Demo1.xls'); 22)放弃存盘: ExcelApp.ActiveWorkBook.Saved: =True; 23)关闭工作簿: ExcelApp.WorkBooks.Close; 24)退出Excel: ExcelApp.Quit; (二)使用Delphi控件方法 在Form中分别放入ExcelApplication,ExcelWorkbook和ExcelWorksheet。 1) 打开Excel ExcelApplication1.Connect; 2)显示当前窗口: ExcelApplication1.Visible[0]: =True; 3)更改Excel标题栏: ExcelApplication1.Caption: ='应用程序调用MicrosoftExcel'; 4)添加新工作簿: ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0)); 5)添加新工作表: varTemp_Worksheet: _WorkSheet; begin Temp_Worksheet: =ExcelWorkbook1. WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,0)as_WorkSheet; ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);End; 6)打开已存在的工作簿: ExcelApplication1.Workbooks.Open(c: \a.xls EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam, EmptyParam,EmptyParam,EmptyParam,EmptyParam,0) 7)设置第2个工作表为活动工作表: ExcelApplication1.WorkSheets[2].Activate; 或 ExcelApplication1.WorksSheets['Sheet2'].Activate; 8)给单元格赋值: ExcelApplication1.Cells[1,4].Value: ='第一行第四列'; 9)设置指定列的宽度(单位: 字符个数),以第一列为例: ExcelApplication1.ActiveSheet.Columns[1].ColumnsWidth: =5; 10)设置指定行的高度(单位: 磅)(1磅=0.035厘米),以第二行为例: ExcelApplication1.ActiveSheet.Rows[2].RowHeight: =1/0.035;//1厘米 11)在第8行之前插入分页符: ExcelApplication1.WorkSheets[1].Rows.PageBreak: =1; 12)在第8列之前删除分页符: ExcelApplication1.ActiveSheet.Columns[4].PageBreak: =0; 13)指定边框线宽度: ExcelApplication1.ActiveSheet.Range['B3: D4'].Borders[2].Weight: =3; 1-左 2-右 3-顶 4-底 5-斜(\) 6-斜(/) 14)清除第一行第四列单元格公式: ExcelApplication1.ActiveSheet.Cells[1,4].ClearContents; 15)设置第一行字体属性: ExcelApplication1.ActiveSheet.Rows[1].Font.Name: ='隶书'; ExcelApplication1.ActiveSheet.Rows[1].Font.Color : =clBlue; ExcelApplication1.ActiveSheet.Rows[1].Font.Bold : =Tru
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串 处理