string

string
string

string字符串库

一、字符串基础

编程最重要的基础技术就是操作字符串,所以我们首先向大家介绍字符串库.

字符串就是由多个字符组成的字符串,注意字符与字符串是不同的.字符只是字符串中一个最小的单位。

一个英文字符、在内存中占用一个8bit位的字节(8个二进制位),在计算机内部字符实际上就是一个8bit 位的数值。

字符在内存中的数值数据称为字节码。

str = "ABCD";

bit = string.byte( str,1 );--我们用string.byte函数取第一个字符的字节码

win.messageBox(bit);-->显示A的字节码65

--实际上在内存中A与65并没有太大的区别

而一个中文字符,通常占两个字节(16个二进制位)

str = "中文字";

size = string.len( str);--我们用string.len取字符串的长度

win.messageBox("字符长度 "..size);-->显示6个字符

通常在其他的编程语言中,字符串指一段文本。文本总是以"\0"(字节码等于0)表示结束。

所以字符串也就不可能包括"\0"。这也是普通文本与二进制数据的最大区别。

但是在LAScript中,字符串指的是二进制数据,而不是单纯的文本。允许包括"\0"。

即可以处一普通的文本,也可以处理二进制数据。这在其他编程语言里似乎不可思议。

string库的函数可以分析处理任何二进制数据。

二、基本函数

n = string.len(str)

返回字符串str的长度n,也可以直接写n = #str;

str2 = string.rep(str, n)

返回重复n次字符串s的串;

类似于c++中的lpsz = char[n],在调用WinAPI的时候,我们可以用这个函数分配字符串缓冲区。

chr = string.byte(str, i)

取字符串str的第i个字符的字节码(整数值);

第二个参数可以省略(使用默认值1)。

chr = string.byte('A');

win.messageBox(chr);-->显示65

str = string.char(chr[,...])

参数为0个或多个整数值,将每个整数作为字符的字节码连接成字符串。

例如:

str = string.char(65,66,67);

win.messageBox(str);-->显示ABC

str = string.c(lpsz)

将API函数中的字符串C指针转换为LAScript字符串. lpsz是一个数字值,必须是一个有效的字符串内存指针.

如果您不是精通C语言中的指针,请谨慎使用这个函数,输入错误的指针值程序会立即崩溃。

tab = string.split( str ,",")

拆分字符串str,第二个参数(可指定多个,可使用模式匹配)指定分隔符,

返回一个table数组。

使用

str2 = string.lower(str)

将字符串str转换为小写

str2 = string.upper(str)

将字符串str团换为大写

str2 = string.reverse(str);

把字符串的所有字符反转变成从后向前排列。

str2 = string.trim(str ," ")

去除字符串首尾指定的字符,用第二个参数指定要去除的字符,

可指定多个,可使用模式匹配,例如用%s表示所有空白字符。

str2 = string.sub(str,i,j)

截取字符串str的从第i个字符到第j个字符之间的字符串。

i和j表示字符串索引,正数从前向后数,负数从后向前数,

1表示第一个字符,-1表示最后一个字符.参数j可以省略(使用默认值-1);

string.sub 是从第i个字符到第j个字符截取字符串。j是指字符串位置而不是指字符串长度

str2 = string.left(str ,n)

从字符串左侧取两个字符,注意一个中文字占两个字节。

你也可以用str2 = string.sub(str,0,n) 实现同样的功能

str2 = string.right(str ,n)

从字符串右侧取两个字符,注意一个中文字占两个字节

你也可以用str2 = string.sub(str,-(n),-1) 实现同样的功能.

注意:

LAScript从不改变现有的字符串,所以不要忘记使用返回值接收被改变的字符串。

str = "abc";

string.right("abc" ,2);--这样的代码没有任何意义,也不会改变str

正确的写法如下:

str = "abc";

str = string.right("abc" ,2);--不要忘记使用返回值接收被改变的字符串

这个规律适合所有截取字符串、改变字符串的函数.

三、格式化字符串

String. format用来格式化字符串(按指定的规则连接字符串或输出其他变量并返回新的字符串) 。

使用方法与C语言的printf函数相同(实际上很多编程语言中都有同样的格式化函数).

String. format(fm,...);

第一个参数用fm表示输出的格式,每个%符号后面是一个格式化表达式,每个格式化表达式按顺序对应后面的参数。

所以用了N个格式化表达式,就必须在后面添加N个参数。

下面是一个简单的例子:

int = 123;

str = "字符串"

--下面的%s对应参数str, %i对应参数int

str = string. format("这是字符串:'%s' 这是数字值%i",str,int);

win.messageBox(str);

--%05i表示格式化为至少五位的数字,不足在前面补0

str = string. format("%05i",int);

win.messageBox(str);

格式化语法详细说明:

格式化表达式:%[零个或多个标志][最小字段宽度][精度][修改符]格式码

注意:[]方括号表示可选参数

1、格式码

代码 c

参数数字值(number)

含义参数被裁剪为8位字节码并作为字符进行打印。

代码i,d

参数数字值(number)

含义参数作为一个十进制整数打印。如果给出了精度而且值的位数小于精度位数,前面就用0填充。

代码u,o,x,X

参数数字值(number)

含义参数作为一个无符号数字值打印,u使用十进制,o使用八进制,x或X使用十六进制,两者的区别是x约定使用abcdef,而X约定使用ABCDEF。

代码e,E

参数数字值(number)

含义参数根据指数形式打印。例如,6.023000e23是使用代码e,6.023000E23是使用代码E。小数点后面的位数由精度字段决定,缺省值是6。

代码 f

参数数字值(number)

含义参数按照的常规浮点格式打印。精度字段决定小数点后面的位数,缺省值是6。

代码g,G

参数数字值(number)

含义参数以%f或%e(如G则%E)的格式打印,取决于它的值。如果指数大于等于-4但小于精度字段就使用%f格式,否则使用指数格式。

代码s

参数字符串值(string)

含义打印一个字符串。

代码q

参数(无)

含义打印一个字符串,并将字符串置于一对引号中,如果字符串中包含引号换行等自动添加转义符。如果要读取一个字符串传为脚本代码。为避免用户恶意注入引号等特殊字符,可以使用%q进行格式化。

代码%

参数(无)

含义取消%转义打印一个%字符,即用%%表示本来的%。

2、标志

标志-

含义值在字段中做对齐,缺省情况下是右对齐。

标志0

含义当数值为右对齐时,缺省情况下是使用空格填充值左边未使用的列。这个标志表示用零填充,它可用于d,i,u,o,x,X,e,E,f,g和G代码。

使用d,i,u,o,x和X代码时,如果给出了精度字段,零标志就被忽略。如果格式代码中出现了负号,零标志也没有效果。

标志+

含义当用于一个格式化某个有符号值代码时,如果值非负,正号标志就会给它加上一个正号。如果该值为负,就像往常一样显示一个负号。在

缺省情况下,正号并不会显示。

标志空格

含义只用于转换有符号值的代码。当值非负时,这个标志把一个空格添加到它开始的位置。注意这个标志和正号标志是相互排斥的,如果两个

同时给出,空格标志便被忽略。

标志#

含义选择某些代码的另一种转换形式:

用于... #标志...

o 保证产生的值以一个零开头

x,X 在非零值前面加0x前缀(%X则为0X)

e,E,f 确保结果始终包含一个小数点,即使它后面没有数字

g,G 和上面的e,E和f代码相同。另外,缀尾的0并不从小数中去除

3、字段宽度

字段宽度是一个十进制整数,用于指定将出现在结果中的最小字符数。如果值的字符数少于字段宽度,就对它进行填充以增加长度。

4、精度

精度以一个句点开头,后面跟一个可选的十进制数。如果未给出整数,精度的缺省值为零。

对于d,i,u,o,x和X类型的转换,精度字段指定将出现在结果中的最小的数字个数并覆盖零标志。如果转换后的值的位数小于宽度,就在它的前面插入零。如果值为零且精度也为零,则转换结果就不会产生数字。

对于e,E和f类型的转换,精度决定将出现在小数点之后的数字位数。

对于g和G类型的转换,它指定将出现在结果中的最大有效位数。

当使用s类型的转换时,精度指定将被转换的最多的字符数。

如果用于表示字段宽度和/或精度的十进制整数由一个星号代替,那么printf的下一个参数(必须是个整数)就提供宽度和(或)精度。因此,

这些值可以通过计算获得而不必预先指定。

5、示例

格式代码A ABC ABCDEFGH

%s A ABC ABCDEFGH

%5s ####A##ABC ABCDEFGH

%.5s A ABC ABCDE

%5.5s####A##ABC ABCDE

%-5s A####ABC##ABCDEFGH

格式代码1-1212345123456789

%d1-1212345123456789

%6d#####1###-12#12345123456789

%.4d0001-001212345123456789

%6.4d##0001#-0012#12345123456789

%-4d1####-12#12345123456789

%04d0001-01212345123456789

%+d+1-12+12345+123456789

格式代码1.01.0001234512345.6789 %f 1.0000000.0100000.00012312345.678900 %10.2d######1.00#####0.01######0.00##12345.67 %e 1.000000e+00 1.000000e-02 1.234500e-04 1.234568e+04 %.4e 1.0000e+00 1.0000e-02 1.2345e-04 1.2346e+04 %g10.010.0001234512345.7

格式代码 6.023e23

%f60229999999999975882752.000000

%10.2e60229999999999975882752.00

%e 6.023000e+23

%.4e 6.0230e+23

%g 6.023e+23

用上面的格式化函数可以轻松实现数字的进制转换

--数字转换为二进制字符串

str = string. format("%b",23 );

--二进制字符串转换为数字

n = tonumber(str,2)

--数字转换为八进制字符串

str = string. format("%o",23 );

--八进制字符串转换为数字

n = tonumber(str,8)

--数字转换为十六进制字符串

str = string. format("%x",23 );

--十六进制字符串转换为数字

n = tonumber(str,16)

四、格式化时间

模拟精灵v7.10 格式化时间的函数有string.time;string.ftime;os.data;os.time等函数。

os.time是从table生成数字时间值 string.time是从字符串生成数字时间值。

os.data与string.ftime功能相同从时间值反过来生成字符串或时间。

这里我们介绍string.time函数、string.ftime函数,下面是使用示例:

--从字符串创建时间值

t = string.time("2006/6/6 0:0:0","%Y/%m/%d %H:%M:%S")

--从时间值创建字符串

str = string.ftime("%Y/%m/%d %H:%M:%S",t )

格式化语法(在很多编程语言中都适用的语法)

%a - 当前区域星期几的简写

%A - 当前区域星期几的全称

%b - 当前区域月份的简写

%B - 当前区域月份的全称

%c - 当前区域首选的日期时间表达

%C - 世纪值(年份除以100 后取整,范围从00 到99)

%d - 月份中的第几天,十进制数字(范围从01 到31)

%D - 和%m/%d/%y 一样

%e - 月份中的第几天,十进制数字,一位的数字前会加上一个空格(范围从' 1' 到'31')

%g - 和%G 一样,但是没有世纪

%G - 4 位数的年份,符合ISO 星期数(参见%V)。和%V 的格式和值一样,只除了如果ISO 星期数属于前一年或者后一年,则使用那一年。

%h - 和%b 一样

%H - 24 小时制的十进制小时数(范围从00 到23)

%I - 12 小时制的十进制小时数(范围从00 到12)

%j - 年份中的第几天,十进制数(范围从001 到366)

%m - 十进制月份(范围从01 到12)

%M - 十进制分钟数

%n - 换行符

%p - 根据给定的时间值为`am' 或`pm',或者当前区域设置中的相应字符串

%r - 用a.m. 和p.m. 符号的时间

%R - 24 小时符号的时间

%S - 十进制秒数

%t - 制表符

%T - 当前时间,和%H:%M:%S 一样

%u - 星期几的十进制数表达[1,7],1 表示星期一

%U - 本年的第几周,从第一周的第一个星期天作为第一天开始

%V - 本年第几周的ISO 8601:1988 格式,范围从01 到53,第 1 周是本年第一个至少还有4 天

的星期,星期一作为每周的第一天。(用%G 或者%g 作为指定时间戳相应周数的年份组成。)

%W - 本年的第几周数,从第一周的第一个星期一作为第一天开始

%w - 星期中的第几天,星期天为0

%x - 当前区域首选的时间表示法,不包括时间

%X - 当前区域首选的时间表示法,不包括日期

%y - 没有世纪数的十进制年份(范围从00 到99)

%Y - 包括世纪数的十进制年份

%Z - 时区名或缩写

%% - 文字上的`%' 字符

一、读写文件

1、读文件

str = string.load(filename);

str = string.load(filename,tag);

第一个字符串参数指定文件名,

第二个字符串参数指定读文件方式(类似io.open的最后一个参数),可省略(默认为"rb");

成功返回文件内容,失败返回nil。

可选的tag参数如下

可以通过以下字符标志控制读文件方式。

---------------------------

r+ 打开文件,如果不存在则创建

r 打开文字文件只读,等于rt

rb 以二进制方式打开文件只读

rt 以文本方式打开文件只读。

b表示以二进制方式读文件,t表示以文本方式读文件.

如果指定t模式,会自动将回车换行符号\r\n替换为单一的换行符号\n

例:

str = string.load("c:\\test.txt","rb");

也可以省略第二个参数,默认为rb。例:

str = string.load("c:\\test.txt");

您也可以自动捕获打开文件时遇到的错误:

--您是否想自动取得string.load为什么会出错呢?使用code,msg = https://www.360docs.net/doc/6012148762.html,stError() 即可。

--您可能会想到,是否可以将https://www.360docs.net/doc/6012148762.html,stError()作为assert的第二个参数自动取得系统提供的错误信息? --但是我们遇到一个参题, 我们必须取https://www.360docs.net/doc/6012148762.html,stError()的第二个返回值,这时候就要用到select函数了str = assert( string.load("c:\\no-file.txt") ,select( 2, https://www.360docs.net/doc/6012148762.html,stError() ) );

https://www.360docs.net/doc/6012148762.html,stError()的所有返回值作为参数传递给select 等于 select(2,code,msg)

--select从第二个参数向后数,找到第一个参数指定的参数并返回

2、写文件

string.save(str,filename)

string.save(str,filename,tag);

第一个字符串参数指定文件名,

第二个字符串参数指定写文件方式(类似io.open的最后一个参数),可省略(默认为"w+b");

成功返回文件长度,失败返回nil。

可以通过以下字符标志控制读写件方式。

---------------------------

"w" 创建文字文件只写

"w+" 打开文件无论是否存在都创建新文件,原来的文件内容会被清除

"a" 打开(文件不存在则创建一个文件)并追加内容

"a+" 打开(文件不存在则创建一个文件)并追加内容

---------------------------

下面两个参数可以附加在上面任一个标记的后面,如果不指定,t为默认项

"b"表示以二进制方式写文件

"t"表示以文本方式写文件

如果指定t模式(或不指定b模式),会自动将单一的换行符号\n替换为回车换行符\r\n。

例:

string.save(str ,"c:\\test.txt","w+b")

也可以省略第二个参数,默认为w+b,例如:

string.save(str ,"c:\\test.txt")

使用string.load string.save io.open等函数设置读写标记时应遵守以下规则:

1、a,w,r等只能出现在第一个标记

用a+ w+ r+表示扩展的属性,如r+表示可读写,而不是rw

2、可使用ccs标记指定编码,

如str = string.load(str,"c:\\test.txt","r,ccs=UTF-8")

将UTF8编码的test.txt读入并转换为标准UNICODE编码

如果输入错误的标记会弹出错误提示,而不是程序崩溃。

考虑到读写文件的效率,不会检测','号后面的指定编码部份是否正确(如果这部份写错了,将会导致程序崩溃)

二、内码转换

str2 = string.toUnicode(str,codepage);

第二个参数指定codepage,可省略第二个参数(默认为ANSI:0 )

将字符串转换从指定编码转换为unicode编码。

string.fromUnicode(str,codepage);

第二个参数指定codepage,可省略第二个参数(默认为ANSI:0 )

从unicode编码还原到指定编码。

在任何两种codepage(包括UTF8)之间转换编码都应当先转换为unicdoe编码

顺序为: codepage1-->unicode->codepage2

例如把UTF8转换为ANSI编码,应当这样写

_CP_UTF8 = 65001--UTF-8 translation

_CP_ACP = 0--default to ANSI code page

str = string.toUnicode(str,_CP_UTF8); --转换为unicode;

str = string.fromUnicode(str,_CP_ACP); --转换为ANSI编码

下面是一个简单的示例,将big5繁体编码转换为gb2312编码

win.consoleOpen();

str = "翠籓羉砰"

str = string.toUnicode(str,950);

print("Unicode",str);

str = string.fromUnicode(str,936);

print("ANSI",str);

三、加密解密

str = string.encode(str[,key])

第一个参数指定待加密的字符串,第二个参数指定密钥。

可省略第二个参数,不指定密钥则进行base64编码,否则加密字符串。

如果指定第二个参数(密钥),则进行加密处理以后,再进行base64编码.

str = string.decode(str[,key[,check]])

第一个参数指定待解密的字符串,第二个参数指定密钥。第三个参数指定在解压前是否进行安全检测. 可省略第二个参数、第三个参数,不指定密钥则进行base64解码,否则解密字符串。

--string.decode的第一个参数如果不是一个已加密的字符串,会出现内存溢出错误。

--为避免出现这个错误,可以在将第三个参数check指定为true启用安全检测。

--不启用安全检测(省略第三个参数)可以加快解密的速度

str2 = string.decode("abcde" ,"k",true);

--通过增加一个true参数启用安全检测,如果字符串不是有效的加密字符串,则返回nil空值

--如果需要自动抛出错误,可以这样写

str2 = assert( string.decode("abcde" ,"k",true),"参数一不是被加密的字符串" );

base64编码可以方便的将二进制文件转换为字符串,以方便通过xml序列化存取。

使用base64编码,您可以把模拟程序要用到的图片、声音等文件写入ApeML的数据区块中。

下面是一个完整示例:

win.consoleOpen();

str = "这是一个字符串"

print(str);

str = string.encode( str,"这是一个密钥");

print("加密以后:"..str);

str = string.decode(str,"这是一个密钥");

print("解密以后:"..str);

三、压缩解压缩

在LAScript中,一个函数即可实现压缩解压缩二进制数据。

str = string.zip(str) 压缩字符串或二进制数据;

str = string.unzip(str) 解压缩字符串或二进制数据;

win.consoleOpen();

str = "这是一个字符串这是一个字符串这是一个字符串这是一个字符串这是一个字符串"

print("压缩以前字符串长度"..#str);

str = string.zip( str);

print("压缩以后字符串长度"..#str);

str = string.unzip(str)

print("解压后的字符串:"..str);

四、生成随机字符串

str = string.random(size[,strs]);

第一个参数指定字符串的长度,

第二个参数指定随机字符串集合(可以省略,默认为所有大小写字母及数字);

这个函数在官方提供的std脚本库中,

必须首先调用import("std")导入std脚本库,然后才能使用这个函数。

import("std"); --导入std脚本库

str = string.random(10);

--生成长度为十位包含大小写字母及数字的随机字符串

str = string.random(10,"这里可以指定字符集合");

--你可以通过第二个参数指定字符集合,可以使用中文、英文字母或数字,但是不要中英文混杂在一起。

六、生成生成全球唯一标志

guid = string.getGUID();

生成全球唯一标志(即永不重复的字符串),返回值是一个字符串。

这个函数在官方提供的std脚本库中,

必须首先调用import("std")导入std脚本库,然后才能使用这个函数。

这个函数也是调用winapi的一个较复杂一点的例子,

可以打开\Fairy_Ape\import\https://www.360docs.net/doc/6012148762.html,S看这个函数的源代码。

import("std");

guid = string.getGUID();

win.messageBox(guid);

查找替换、模式匹配

一、查找字符串的位置

i,j = string.find(str,"要查找的字符串"[,pos[, plain]]);

使用模式匹配查找字符串并返回起始位置(i),结束位置(j);

第三个参数pos指定搜索开始的位置,这个参数可以省略(使用默认值1);

第四个参数指定是否禁用模式匹配,默认为false;

如果查找失败,i,j都返回nil值.下面是一个简单的例子:

i,j = string.find("abcd" ,"cd");

if(i and j)then

win.messageBox("在'abcd' 中找到'cd' ,从"..i.."到"..j);

end;

if(not string.find("abcd" ,"不可能") )then

win.messageBox("没有从'abcd' 中找到'不可能' ");

end;

有时候我们可能不需要模式匹配,虽然他很好用。例如下面的代码

i,j = string.find("abc%d" ,"cd%d");--结果是找不到

我们要找的是%d,但是模式匹配认为%d是一个数字,所以我们要再加一个%取消转义i,j = string.find("abc%d" ,"cd%%d");--终于找到了%d

我们可以写一个函数来自动的为所有标点添加%转义符取消转义

function string.plain(s)

--%p匹配所有的标点,在前面加上%转义符取消转义成为普通的标记。

--%%%1 其中%%表示%,%1表示查找模式中的第一个括号匹配的查找结果。

return string.gsub(s, "(%p)", "%%%1");

end;

i,j = string.find("abc%d" ,string.plain("cd%d"));--终于找到了

一个更好更快的方法,是通过指定string.find的第四个参数plain为true禁用模式匹配。

i,j = string.find("abc%d" ,"cd%d",1,true);--终于找到了%d

string.find常常用来查找一个字符串在目标串中的位置,后面我们还会介绍更加强大的string.match 以及string.gmatch 函数

二、替换字符串

str = string.gsub (str, pattern, repl [, n])

参数分别为(目标字符串,查找模式字符串,替换字符串,替换次数)。

最后一个可选参数指定替换的次数,如果不指定则替换所有的找到的字符串。

--在模式匹配中 .圆点标记匹配任意字符。

str = string.gsub("abcd",".","k");

win.messageBox(str);-->结果是kkkk

str = string.gsub("abcd",".","k",1);

win.messageBox(str);-->结果是kbcd

pattern参数(查找模式字符串)可以使用所有模式匹配语法。

repl参数则为普通字符串,但是可以用%1,%2,%3..........等匹配模式匹配中的捕获(即一个括号中匹配的查找结果);

看下面的示例:

--在模式匹配中 .圆点标记匹配任意字符。

str = string.gsub("abcd","(.)","%1k");

win.messageBox(str);-->结果是akbkckdk

二、模式匹配-语法

首先我们有必要解释一下什么是模式匹配。

模式匹配类似正则表达式,但更加简洁高效,更加易于学习、分析字符串的速度更快。

模式匹配:用特定的模式语法组成的模式串查找匹配有规则的字符串。

模式串:根据模式语法编写的字符串,用来要找匹配有规则的目标字符串。

模式语法--字符类

. 任意字符

%a 字母

%c 控制字符

%d 数字

%l 小写字母

%p 标点字符

%s 空白符

%u 大写字母

%w 字母和数字

%x 十六进制数字

%z \0 字节码为0的字符,对于普通文本表示文本结束

上面字符类的大写形式表示小写所代表的集合的补集

%A 不是字母的字符

%C 不是控制字符的字符

%D 不是数字的字符

%L 不是小写字母的字符

%P 不是标点的字符

%S 不是空白符的字符

%U 不是大写字母的字符

%W 不是字母和数字的字符

%X 不是十六进制数字的字符

%Z 不是\0的字符

上面字符类的大写形式表示小写所代表的集合的补集

模式语法--自定义字符类

[]

方括号用来创建自定义的字符类,

例如[abcd]匹配一个可能是abcd其中之一的字符。[%w_]匹配数字、字母和下划线。

我们还可以在两个字符之间用连字符连接表示这两个字符之间范围内的字符集合。例如[0-7]等同于[01234567]。

我们还可以用字符集的开始处使用`^′ 表示其补集,'[^0-7]' 匹配任何不是八进制数字的字符;'[^\n]' 匹配任何非换行符户的字符。

模式语法--转义符

%

后面如果是字母表示后面是一个字符类,

%后面如果是一个标点表示这个标点不是模式语法,例如%%表示本来的%

模式语法--修饰符列表

+ 匹配前一字符1次或多次,总是进行最长的匹配

* 匹配前一字符0次或多次,进行的是最长匹配

- 匹配前一字符0次或多次,进行的是最短匹配

? 匹配前一字符0次或1次

下面用一个简单的例子来说明最短匹配与最长匹配的区别:

str = "a1234z"

str2 = string.match(str, "a%d-")

win.messageBox(str2); --[[因为-是最短匹配,显示"a",

因为"a"符合查找模式串的最短字符串]]

str2 = string.match(str, "a%d*")

win.messageBox(str2); --[[因为*是最短匹配,显示"a1234",

因为"a1234"符合查找模式串的最长字符串]]

str2 = string.match(str, "a%d-z")

win.messageBox(str2);--[[虽然-是最短匹配,

但是符合查找模式串的最短字符串是a1234d,因为模式串指定了数字后面有一个字符z]]

%b

用来匹配对称的字符,例如'%b()'匹配以`(′开始,以`)′结束的字符串:,例如'%b""'匹配以引号开始,以引号结束的字符串:

str = 'a = "abcd"'

str2 = string.match(str, '%b""')

win.messageBox(str2); --显示"abcd"

字符串如果包含双引号则应放在单引号中,或者放在[[ ]] 中间,

如果放在双引号中则必须加上\转义符.

str =" a =\"abcd\" "; --正确

str =' a ="abcd" '; --正确

str =[[ a ="abcd" ]]; --正确

str =" a ="abcd"] "; --错误的写法

修饰符只能用来修饰单个字符或字符类。

模式语法--限定符

^

以`^′开头的模式只匹配目标串的开始部分

$

以`$′结尾的模式只匹配目标串的结尾部分

str = "1234"

if string.find(str, "^%d") then

win.messageBox(str.." 字符串以数字开始")

end;

if string.find(str, "^[+-]?%d+$") then

win.messageBox(str.." 字符串是一个整数")

end;

模式语法--匹配分组

( )

对查找结果进行分组.将模式串的一部份用圆括号括起来指定一个匹配分组,

每个匹配分组对应的查找结果称为一个捕获分组(capture)

我们可以在模式中使用'%d'(d代表1-9的数字) 表示第d个捕获分组。

三、模式匹配-分组捕获(capture)

1、在string.find中使用分组捕获,

string.find会将所有的分组捕获增加到返回值队列中。

我们用一个示例来解释一下.

下面是一个简单的例子,除了括号分组没有使用其他的模式语法。

i,j,v,v2 = string.find("abcd" ,"(ab)(cd)");

win.consoleOpen();

print(v,v2); --结果为v等于"ab" v2等于"cd"

再看一个类似的例子,使用了模式语法。

win.consoleOpen()

pair = "name = value"

--增加了两个返回值name,value,分别对应查找模式串中的两个括号组成的匹配分组

i, j, n, v = string.find(pair, "(%a+)%s*=%s*(%a+)")

print(i,j,n,v) --> 显示name value

2、向前引用

我们可以在模式中使用向前引用已经找到的捕获分组,'%d'(d代表1-9的数字) 表示第d个捕获的拷贝。

--假定有一个字符串

str =[[ a = " test = 'abc' " ]]

--[[

现在的任务是用模式匹配找出test = 'abc'

按照最基本的语法。

单引号开始的字符串必须用单引号结束,中间允许双引号。

双引号开始的字符串必须用双引号结束,中间允许单引号。

所以现在首要的问题是在模式串中向前引用第一次找到的引号。

而使用%b""又无法适用这种情况,因为字符串也有可能以单引号开始

]]

--第一个引号放到括号里形成一个匹配分组,其捕获结果用%1表示

--可以看到在模式串的后部份向前引用了%1

a, b, quote, str2 = string.find(str, [[(["'])(.-)%1]]);

win.consoleOpen();

print(str2) -->显示test = 'abc'

print(quote) -->显示双引号

2、在string.gsub中使用分组捕获,

str = string.gsub (str, pattern, repl [, n])

参数分别为(目标字符串,查找模式串,替换字符串,替换次数)。

在模找模式串pattern中可以使用括号分组,在替换串参数repl中可以用%d(d为1到9的数字)引用分组捕获。

--复制字符串中的每一个字符.

str = string.gsub("hello","(.)","%1%1"); win.messageBox(str); --显示hheelllloo

--下面代码互换相邻的字符:

str = string.gsub("hello", "(.)(.)", "%2%1")

win.messageBox(str);--显示ehllo

3、在string.gsub中使用函数处理分组捕获,

str = string.gsub (str, pattern, func [, n])

string.gsub参数的第三个参数也可以是一个函数。

string.gsub会将所有分组捕获作为func的参数,并且调用func函数,并且用func函数的返回值作为替换串。

可以在模式匹配中直接使用函数,是模式匹配中最好用的一个功能。

--如果两个捕获都是数字则相加,否则将位置前后掉换

function func(a,b)

if(tonumber(a) and tonumber(b) )then

return a + b;--如果两个捕获都是数字则相加

else

return b..a;--否则将位置前后掉换

end;

end;

--复制字符串中的每一个字符.

str = string.gsub("abcdef23","(.)(.)",func);

win.messageBox(str); --显示badcef5

3、string.match 查找模式串

string.match(str, pattern)

第一个参数指定目标字符串,每二个参数指定查找模式串。这个函数与string.find很象。

但是不会返回查找结果的开始位置与结束位置。而仅仅是返回找到的一个或多个分组捕获。

local v,v2 = string.match("abcd", "(ab)(cd)");

win.consoleOpen();

print(v,v2); -->显示v等于"ab" v2等于"cd"

如果不显示的用括号指定捕获,函数将捕获整个匹配模式。

--%d表示数字%d+表示最长匹配多个数字

local v = string.match("abcd1234", "%d+");

win.consoleOpen();

print(v); -->显示v等于"1234"

3、string.gmatch 全局查找模式串

func = string.gmatch(str, pattern)

这个函数的功能很象string.gsub但是不会进行替换操作。

win.consoleOpen();

--for后面的变量对应查找模式串中的括号分组(有几对括号就有几个返回值)

for str,int in string.gmatch( "abcd1234xyz999","(%a+)(%d+)") do

print(str,int);

end;

string.gmatch函数比较适合用于泛型for循环。他可以遍历一个字符串内所有匹配模式的子串。

调用string.gmatch函数的时候,如果不显示的指定捕获,函数将捕获整个匹配模式。

实际上string.gmatch的返回值是一个迭代器函数,每调用这个函数一次就会向后查找一个匹配直到查找失败。

上面在泛型for中执行string.gmatch的过程实际上可以理解成这样:

win.consoleOpen();

f = string.gmatch( "abcd1234xyz999","(%a+)(%d+)");

str,int = f();

print(str,int);

str,int = f();

print(str,int);

四、自动提取中文字符串

str = [[abcddddddddddddd这是一个中文字符串adfasdfasdf这又是一个中文字符串这是超链接标题]]

--现在需要自动的把上面的中文提取出来并且放到一个数组里,

--不要英文不要空格只要中文字

--怎么办呢?

--打开控制台

win.consoleOpen();

for str in string.gfind(str,"([\x A1-\x F7][\x A1-\x F7\x A1-\x FE]+)") do

print(str)

end

--[[一个中文字实际上由两个字节组成,常用字的编码范围是有规律的,

第一个字节是在0xA1-0xF7之间,第二个字节是在0xA1-0xFE 之间。

字符串里面\xFE表示后面是一个十六进制,如果用\254 后面跟三位十进制数字也可以。

模式匹配中[] 表示一个字符范围,例如[0-9]表示所有数字[0-9a-zA-Z]表示所有数字也英文字母

+表示任意多个连续的字符匹配。

一组括号表示添加一个返回值,这里只有一组括号,所以只有一个返回值str。

因为中文字至少是两个字节,所以首先用[\xA1-\xF7]检查每一个字节是否中文字的首字节。

如果发现两个字节都符合中文字的编码规则,则向后长匹配所有在中文编码范围的字节。]]

五、模式匹配-查找网页源代码中的超链接

下面是一个应用模式匹配的完整示例- 下载网页并取得网页源代码中的所有超链接:

win.consoleOpen() --打开控制台窗口

print("请稍候.......")

--[==============================[

大家知道,在web窗体中,我们可以用 wb:eleLinks() 得到所有的链接链(返回一组element,详见教程)

这需要我们用web窗体打开网页,然后再调用 wb:eleLinks()

那么,我们有没有更好的办法直接分析源代码,并取得所有的超链接呢?

有的,如下:

--]==============================]

-- 首先,我们下载https://www.360docs.net/doc/6012148762.html, 的主页到一个字符串(string对象)中

strHtmlCode = web.getURL("https://www.360docs.net/doc/6012148762.html,")

--然后我们创建一个空的table数组

links = {}

--[==============================[string.gmatch 全局查找子串,每个括号指定的一个分组匹配(对应一个分组捕获,在泛型for中增加一个返回值)与string.match 不同,string.gmatch发现一个完整匹配以后,会继续向后查找,

--]==============================]

for href in string.gm atch(strHtmlCode,

"%s*href%s*=%s*\"?\'?([:%w%./@]+)\"?\'?%s*") do

table.insert(links, href) --发现一个超链接,添加到links列表中

end

--[==============================[

我们解释一下模式串"%s*href%s*=%s*\"?\'?([:%w%./@]+)\"?\'?%s*"

%是转义符%s表示空白字符%s*表示空白字符出现一次或多次\"表示引号(\转义符的使用与普通字符串相同)

?表示出现一次或零次%w表示字母和数字%.表示.(因为.是特殊字符,所以需要%还原)

[]是一个自定义的字符类,如[0-9]匹配所有数字

+是修饰符表示前面的字符出现一次或多次

--]==============================]

local url;

--好了,我们现在得到了所有的超链接,并保存在links列表中了,我们输出看一下

for i,link in pairs(links) do

print("发现一个超链接:"..link)

url = urlparse.new(link);

print("","主机",url:host() );

print("","路径",url:path() );

print("","协议",url:scheme() );

end;

六、模式匹配-应用技巧

1、限制严格的模式比一个限制宽松的模式更快

2、严格限制模式匹配的开始字符可以显著提升效率.

例如模式串"(.-)test" 用来获取test以前的全部字符

上面的算法从目标串的第一个字符开始匹配直到字符串结束,

如果没有找到,则从目标串的第二个字符开始再次查找。

这样的查找效率是很低的。

解决办法是加上限定符"^(.-)test" 限定仅与目标串的开始字符匹配。

3、不要使用可能匹配空字符串的模式。

例如"%a*",因为可以出现零次则空字符串也是符合条件的。

永远不要写一个以`-′开头或者结尾的模式,因为它将匹配空字符串。

4、使用string.rep函数构造重复指定的次数的模式。

例如pattern = string.rep("%d", 10);

实际生成的pattern 等于"%d%d%d%d%d%d%d%d%d%d" 这个模式串匹配10个连续的数字。

STRING类函数用法总结3

C++中的string类 前言:string的角色 1string使用 1.1充分使用string操作符 1.2眼花缭乱的string find函数 1.3string insert,replace,erase2string和C风格字符串 3string和Charactor Traits 4string建议 5小结 6附录前言:string的角色 C++语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触perl,php,和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。 举例来说,如果文本格式是:用户名电话号码,文件名name.txt Tom23245332 Jenny22231231 Heny22183942 Tom23245332 ... 现在我们需要对用户名排序,且只输出不同的姓名。 那么在shell编程中,可以这样用: awk'{print$1}'name.txt|sort|uniq 简单吧? 如果使用C/C++就麻烦了,他需要做以下工作: 先打开文件,检测文件是否打开,如果失败,则退出。 声明一个足够大得二维字符数组或者一个字符指针数组 读入一行到字符空间 然后分析一行的结构,找到空格,存入字符数组中。 关闭文件 写一个排序函数,或者使用写一个比较函数,使用qsort排序 遍历数组,比较是否有相同的,如果有,则要删除,copy... 输出信息 你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种

java String类的用法

1 String 类的用法 public class SetStringValue { /** * @param args */ public static void main(String[] args) { String str1=new String("Java是当今最流行的编程语言之一");//截取数组 String str2="java是优秀的技术"; char[] szStr={'H','e','l','l','o',',','j','a','v','a'}; String str3=String.copyValueOf(szStr);//复制数组,所有数组。 String str4=String.copyValueOf(szStr,6,4);//所取数组,开始位置,所取个数 System.out.println(str1); System.out.println(str2); System.out.println(str3); System.out.println(str4); // TODO Auto-generated method stub } } 2 public class StringPool { /** * @param args */ public static void main(String[] args) { String str1="Good!"; String str2="Good!"; String str3=new String("Good!"); if(str1==str2)//判断地址是否相同 { System.out.println("str1=str2");//地址相同则输出相等

string类的使用教程

这个是string类的使用教程,可以参考一下 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用= 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 好了,进入正题……… 首先,为了在我们的程序中使用string类型,我们必须包含头文件。如下:#include //注意这里不是string.h string.h是C字符串头文件 1.声明一个C++字符串 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str初始化为一个空字符串。String类的构造函数和析构函数如下: a) string s; //生成一个空字符串s b) string s(str) //拷贝构造函数生成str的复制品 c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值 e) string s(cstr) //将C字符串作为s的初值 f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s 的初值。 g) string s(num,c) //生成一个字符串,包含num个c字符 h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 i) s.~string() //销毁所有字符,释放内存 都很简单,我就不解释了。 2.字符串操作函数 这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 a) =,assign() //赋以新值 b) swap() //交换两个字符串的内容 c) +=,append(),push_back() //在尾部添加字符 d) insert() //插入字符 e) erase() //删除字符 f) clear() //删除全部字符 g) replace() //替换字符 h) + //串联字符串 i) ==,!=,<,<=,>,>=,compare() //比较字符串 j) size(),length() //返回字符数量

C++string类型总结

对C++中string类型的总结 string类对象的构造 简化构造函数原型如下(注意,为了简便,把模板中最后一个默认参数省略了): 1: explicit basic_string(); 2: string(const char *s); 3: string(const char *s, size_type n); 4: string(const string& str); 5: string(const string& str, size_type pos, size_type n); 6: string(size_type n, E c); 7: string(const_iterator first, const_iterator last); string对象的操作 字符串比较 支持六种关系运算符(==、!=、>、>=、<、<=),其采用字典排序策略(与C中字符串比较策略完全一样)。这六个关系运算符是非成员的重载运算符。而这些 运算符都支持三种操作数组合:string op string、string op const char*、cons t char* op string(其中op是前面六种关系运算符中任意一种)。解释:提供运算 符的三种重载版本主要是从效率角度考虑的,其避免了临时string对象的产生。 另外,string类还提供了各种重载版本的成员函数compare来比较,简化函数原型为: 1: int compare(const string& str) const; 2: int compare(size_type p0, size_type n0, const string& str); 3: int compare(size_type p0, size_type n0, const string& str, si ze_type pos, size_type n); 4: int compare(const char* s) const; 5: int compare(size_type p0, size_type n0, const char* s) const; 6: int compare(size_type p0, size_type n0, const char* s, size_t ype n) const; 返回值:如果调用该函数的对象的比较序列小于操作数比较序列,则返回负数; 若相等,则返回0;否则,返回正数。

C#中string用法

C#中String用法 标记 标记(tokenizing)是从文本中提取具体内容的过程。 下面的代码从句子中提取单词,并把它们输出到控制台。 class mytokenizing { static void main(string[ ] args) { string mystring="i like this food,are you?"; char[] separators={ ,,,?,:,!}; int startpos=0; int endpos=0; do { endpos=mystring.indexofany(separators,startpos); if ( endpos==-1 ) endpos=mystring.length; if ( endpos!=startpos ) console.writeline(mystring.substring( startpos,(endpos-startpos))); startpos=(endpos+1); }while(startpos

array.reverse(mychars); console.writeline(mystring); console.writeline(mychars); } } 任何继承于array的类都能利用reverse( )方法为数组中的元素重新排序。 字符串的插入、删除和替换 示例文件test.txt为字符串的来源。 下面代码以unicode格式读取文本。确保文件保存为读取时的格式。例如记事本允许将代码保存为unicode: aaaaaaaa,bbbbbbbb,cccccc dddddddd,eeeeeeee,ffffff gggggggg,hhhhhhhh,iiiiii jjjjjjjj,kkkkkkkk,llllll 下面代码加载数据并处理数据的测试工具。测试结果发送给控制台。 class myprocessfile { static void main(string [] args) { const string myname="test.txt"; stream readline; textwirter writeline; stringbuilder sb; readline=file.openread(myname); writeline=console.out; streamreader readlinesreader=new streamreader(readline,encoding.unicode); readlinesreader.basestream.seek(0,seekorigin.begin); while(readlinesreader.peek()>-1) { sb=new stringbuilder(readlinesreader.readline()); //插入字符串操作语句如:sb.append(",123"); console.writeline(sb.tostring()); } } } 在结尾添加一列内容: //displays aaaaaaaa,bbbbbbbb,cccccc,xxxxx //...... sb.append(",xxxxx");

CPPstring类常用函数

C++string类常用函数 string类的构造函数: string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 此外,string类还支持默认构造函数和复制构造函数,如string s1;string s2="hello";都是正确的写法。当构造的string太长而无法表达时会抛出length_error异常 string类的字符操作: const char &operator[](int n)const; const char &at(int n)const; char &operator[](int n); char &at(int n); operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range异常,下标运算符[]不提供检查访问。 const char *data()const;//返回一个非null终止的c字符数组 const char *c_str()const;//返回一个以null终止的c字符串 int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目 string的特性描述: int capacity()const; //返回当前容量(即string中不必增加内存即可存放的元素个数) int max_size()const; //返回string对象中可存放的最大字符串的长度 int size()const; //返回当前字符串的大小 int length()const; //返回当前字符串的长度 bool empty()const; //当前字符串是否为空 void resize(int len,char c);//把字符串当前大小置为len,并用字符c填充不足的部分 string类的输入输出操作: string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。 函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符'\n'分开。 string的赋值: string &operator=(const string &s);//把字符串s赋给当前字符串 string &assign(const char *s);//用c类型字符串s赋值 string &assign(const char *s,int n);//用c字符串s开始的n个字符赋值 string &assign(const string &s);//把字符串s赋给当前字符串 string &assign(int n,char c);//用n个字符c赋值给当前字符串 string &assign(const string &s,int start,int n);//把字符串s中从start开始的n个字符赋给当前字符串 string &assign(const_iterator first,const_itertor last);//把first和last迭代器之间的部

string类中函数介绍

标准c++中string类函数介绍 注意不是CString 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用= 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 好了,进入正题……… 首先,为了在我们的程序中使用string类型,我们必须包含头文件。 如下: #include //注意这里不是string.h string.h是C字符串头文件 #include using namespace std; 1.声明一个C++字符串 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。String类的构造函数和析构函数如下: a) string s; //生成一个空字符串s b) string s(str) //拷贝构造函数生成str的复制品 c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多strlen”的部分作为字符串的初值 e) string s(cstr) //将C字符串作为s的初值 f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 g) string s(num,c) //生成一个字符串,包含num个c字符 h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 i) s.~string() //销毁所有字符,释放内存 都很简单,我就不解释了。 2.字符串操作函数 这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 a) =,assign() //赋以新值 b) swap() //交换两个字符串的内容 c) +=,append(),push_back() //在尾部添加字符

C++ string类专题(修订版)

本文作者:黄邦勇帅(编著)(原名:黄勇) 本文是学习C++的附加内容,主要介绍了C++中的string类的各种成员函数,及成员函数的功能与作用,是作为学习C++的参考使用的。 本文内容完全属于个人见解与参考文现的作者无关,其中难免有误解之处,望指出更正 本文使用的是x86机器(主流计算机都是x86机器),windows xp操作系统,VC++2010编译器进行讲解的。 本文内容完全属于个人见解与参考文现的作者无关,限于水平有限,其中难免有误解之处,望指出更正。 声明:禁止抄袭,复印,转载本文,本文作者拥有完全版权。 主要参考文献: 1、C++.Primer.Plus.第五版.中文版[美]Stephen Prata著孙建春韦强译人民邮电出版社 2005年5月 2、C++.Primer第四版.中文版 Stanley B.Lippman、Barbara E.Moo、Josee Lajoie著李师贤、蒋爱军等译人民邮电出版社 2006年3月 3、C++.Primer第三版.中文版 Stanley B.Lippman、Josee Lajoie著潘爱民、张丽等译中国电力版社 2002年5月 第19部分 string类专题(共9页) (2016-7-15 修订版) 1、string类用于处理字符串,用于代替使用不方便的C风格字符串,使用string类表示的字符串我们可以像处理普通 变量那样处理字符串,因此可以对string类表示的字符串进行直接的相加,比较,赋值等操作,比如string s1=”abc”,s2=”def”;则s1=s1+s2;结果s1=”abcdef”;s1=s2;则结果s1=”def” 等,C风格字符串只能使用内置的库函数进行这些操作,使用很不方便,比如char c1[]=”abc”; char c2[]=”def”;则c1=c2;错误,不能改变数组的地址,c1>c2比较的是两个指针的地址而不是字符的大小;c1+c2;错误,这是把两个指针的地址相加而不是把两个字符数组相加。 2、string对象创建的字符串的最大特点是:可以自动调整对象大小以适应所需的字符串,string对象能存储的最大字符 数由string类的静态常量string::npos设定,通常是最大的unsigned int值。 一、string类的原型 1、要使用string类需要包含string头文件。 2、string是一个模板类,因此它具有类和模板的特性,也就是说string类有构造函数、重载的操作符、成员函数等, 因为string是模板类,因此应建一个模板类具体实例化版本的对象才能使用,然后通过对象调用成员函数使用类。 3、记住string s;创建的s是一个类的对象,而不是字符串字面值,他们是两种不同的类型。 4、string类是模板类basic_string类的char特化体版本使用typedef命名后的别名,wstring类是模板类basic_string的 wchar特体化版本使用typedef命名后的别名。 5、basic_string类的原型为(重点): template, class Allocator=allocator > class basic_string; 1)、charT是个类型模板形参,若实例化时传递char类型,则charT=char,传递wchar则charT=wchar 2)、traits是类型模板形参,描述了字符串的特征,比如字符串是否以’\0’作为结束尾等。traits要求传递一个 char_traits的模板类型作为实参。 3)、Allocator也是个类模板形参,他的主要作用是用于处理字符串的内存分配问题,默认使用new和delete分配内 存。Allocator要求传递一个allocator类型的模板类型作为实参。 4)、basic_string有两个特化体版本(重点),如下所示,当然我们也可以实例化其他类型版本的base_string类模板, ①、typedef base_string string; //即string类是使用typedef重命名后的basic_string类模板的char特化体版本。 ②、typedef base_string wstring; //主要用于处理宽字符串。 6、size_type类型(重要):size_type是basic_string类中定义的类型,一般被定义为unsigned类型。需要使用限定名的 方法来使用size_type类型,比如string::size_type a;或basic_string::size_type a; 7、npos静态常量(重要):表示string对象能够存储的最大字符数,其形式为:static const size_type npos=-1; 可见npos 是basic_string类中定义的静态常量,其类型为size_type其值为-1,对于无符号的size_type变量,赋值为-1,相当于是把最大的无符号数赋值给了他。 二、string类的构造函数 1、basic_string的构造函数与char特化版本的string构造函数的差别,只在于basic_string构造函数多了一个用于分配

C 中的string常用函数用法总结.

C++中的string常用函数用法总结首先,为了在我们的程序中使用string类型,我们必须包含头文件。 如下: #include //注意这里不是string.h string.h是C字符串头文件 #include using namespace std; 1.声明一个C++字符串 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。String类的构造函数和析构函数如下: a) string s; //生成一个空字符串s b) string s(str) //拷贝构造函数生成str的复制品 c) string s(str,stridx) //将字符串str内“始于位置stridx”的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串str内“始于stridx且长度顶多st rlen”的部分作为字符串的初值 e) string s(cstr) //将C字符串作为s的初值 f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 g) string s(num,c) //生成一个字符串,包含num个c字符 h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 i) s.~string() //销毁所有字符,释放内存 都很简单,我就不解释了。

C++string类标准库常用函数

C++ string类标准库常用函数 [string类的构造函数] string(const char *s); //用c字符串s初始化 string(int n,char c); //用n个字符c初始化 [string类的字符操作] const char &operator[](int n) const; const char &at(int n) const; char &operator[](int n); char &at(int n); operator[]和at()均返回当前字符串中第n个字符的位置,但at函数提供范围检查,当越界时会抛出out_of_range 异常,下标运算符[]不提供检查访问。 const char *data() const; //返回一个非null终止的c字符数组 const char *c_str() const; //返回一个以null终止的c字符串 int copy(char *s, int n, int pos = 0) const;//把当前串中以pos开始的n个字符拷贝到以s为起始位置的字符数组中,返回实际拷贝的数目 [string的特性描述] int capacity() const; //返回当前容量(即string中不必增加内存即可存放的元素个数) int max_size() const; //返回string对象中可存放的最大字符串的长度 int size() const; //返回当前字符串的大小 int length() const; //返回当前字符串的长度 bool empty() const; //当前字符串是否为空 void resize(int len,char c); //把字符串当前大小置为len,并用字符c填充不足的部分 [string类的输入输出操作] string类重载运算符operator>>用于输入,同样重载运算符operator<<用于输出操作。 函数getline(istream &in,string &s);用于从输入流in中读取字符串到s中,以换行符'\n'分开。 [string的赋值] string &operator=(const string &s); //把字符串s赋给当前字符串 string &assign(const char *s); //用c类型字符串s赋值 string &assign(const char *s,int n); //用c字符串s开始的n个字符赋值 string &assign(const string &s); //把字符串s赋给当前字符串 string &assign(int n,char c); //用n个字符c赋值给当前字符串 string &assign(const string &s,int start,int n);//把s中从start开始的n个字符赋给当前字符串string &assign(const_iterator first,const_iterator last);//把迭代器first和last之间的部分赋给字符串 [string的连接] string &operator+=(const string &s); //把字符串s连接到当前字符串的结尾 string &append(const char *s); //把c类型字符串s连接到当前字符串结尾 string &append(const char *s,int n); //把c类型字符串s的前n个字符连接到当前字符串结尾 string &append(const string &s); //同operator+=() string &append(const string &s,int pos,int n); //把字符串s中从pos开始的n个字符连接到当前字符串的结尾 string &append(int n,char c); //在当前字符串结尾添加n个字符c string &append(const_iterator first,const_iterator last); //把迭代器first和last之间的部分连接到当前字符串的结尾

Qt 的QString类的使用

Qt 的QString类的使用Qt的QString类提供了很方便的对字符串操作的接口。 1.使某个字符填满字符串,也就是说字符串里的所有字符都有等长度的ch来代替。 QString::fill ( QChar ch, int size = -1 ) 例: QString str = "Berlin"; str.fill('z'); // str == "zzzzzz" str.fill('A', 2); // str == "AA" 2,从字符串里查找相同的某个字符串str。 int QString::indexOf ( const QString & str, int from = 0, Qt::CaseSensitivity cs = Qt::CaseSensitive ) const 例如: QString x = "sticky question"; QString y = "sti"; x.indexOf(y); // returns 0 x.indexOf(y, 1); // returns 10 x.indexOf(y, 10); // returns 10 x.indexOf(y, 11); // returns -1 3指定位置插入字符串 QString & QString::insert ( int position, const QString & str ) 例如: QString str = "Meal"; str.insert(1, QString("ontr")); // str == "Montreal" 3,判断字符串是否为空。 bool QString::isEmpty () const 如: QString().isEmpty(); // returns true QString("").isEmpty(); // returns true QString("x").isEmpty(); // returns false QString("abc").isEmpty(); // returns false

C语言string函数详解

C语言string函数详解

C语言string函数详解 函数原型: char *strdup(const char *s) 函数功能: 字符串拷贝,目的空间由该函数分配 函数返回: 指向拷贝后的字符串指针 参数说明: src-待拷贝的源字符串 所属文件: #include #include #include int main() { char *dup_str, *string="abcde"; dup_str=strdup(string); printf("%s", dup_str); free(dup_str); return 0; } @函数名称: strcpy

函数原型: char* strcpy(char* str1,char* str2); 函数功能: 把str2指向的字符串拷贝到str1中去 函数返回: 返回str1,即指向str1的指针 参数说明: 所属文件: #include #include int main() { char string[10]; char *str1="abcdefghi"; strcpy(string,str1); printf("the string is:%s\n",string); return 0; }

@函数名称: strncpy 函数原型: char *strncpy(char *dest, const char *src,int count) 函数功能: 将字符串src中的count个字符拷贝到字符串dest中去 函数返回: 指向dest的指针 参数说明: dest-目的字符串,src-源字符串,count-拷贝的字符个数 所属文件: #include #include int main() { char string[10]; char *str1="abcdefghi"; strncpy(string,str1,3); string[3]='\0'; printf("%s",string); return 0; }

c++中string的用法

之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够、字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是100%)的需要。我们可以用 = 进行赋值操作,== 进行比较,+ 做串联(是不是很简单?)。我们尽可以把它看成是C++的基本数据类型。 首先,为了在我们的程序中使用string类型,我们必须包含头文件 。如下: #include //注意这里不是string.h string.h是C字符串头文件 1.声明一个C++字符串 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。String类的构造函数和析构函数如下: a) string s; //生成一个空字符串s b) string s(str) //拷贝构造函数生成str的复制品 c) string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值 e) string s(cstr) //将C字符串作为s的初值 f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 g) string s(num,c) //生成一个字符串,包含num个c字符 h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 i) s.~string() //销毁所有字符,释放内存 都很简单,我就不解释了。 2.字符串操作函数 这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 a) =,assign() //赋以新值 b) swap() //交换两个字符串的内容 c) +=,append(),push_back() //在尾部添加字符 d) insert() //插入字符 e) erase() //删除字符 f) clear() //删除全部字符 g) replace() //替换字符 h) + //串联字符串 i) ==,!=,<,<=,>,>=,compare() //比较字符串 j) size(),length() //返回字符数量 k) max_size() //返回字符的可能最大个数 l) empty() //判断字符串是否为空 m) capacity() //返回重新分配之前的字符容量

string的用法

1.声明一个C++字符串 声明一个字符串变量很简单: string Str; 这样我们就声明了一个字符串变量,但既然是一个类,就有构造函数和析构函数。上面的声明没有传入参数,所以就直接使用了string的默认的构造函数,这个函数所作的就是把Str 初始化为一个空字符串。String类的构造函数和析构函数如下: a) string s; //生成一个空字符串s b) string s(str) //拷贝构造函数生成str的复制品 c) string s(str,stridx) //将字符串str内"始于位置stridx"的部分当作字符串的初值 d) string s(str,stridx,strlen) //将字符串str内"始于stridx且长度顶多strlen"的部分作为字符串的初值 e) string s(cstr) //将C字符串作为s的初值 f) string s(chars,chars_len) //将C字符串前chars_len个字符作为字符串s的初值。 g) string s(num,c) //生成一个字符串,包含num个c字符 h) string s(beg,end) //以区间beg;end(不包含end)内的字符作为字符串s的初值 i) s.~string() //销毁所有字符,释放内存 都很简单,我就不解释了。 2.字符串操作函数 这里是C++字符串的重点,我先把各种操作函数罗列出来,不喜欢把所有函数都看完的人可以在这里找自己喜欢的函数,再到后面看他的详细解释。 a) =,assign() //赋以新值 b) swap() //交换两个字符串的内容 c) +=,append(),push_back() //在尾部添加字符 d) insert() //插入字符 e) erase() //删除字符 f) clear() //删除全部字符 g) replace() //替换字符 h) + //串联字符串 i) ==,!=,<,<=,>,>=,compare() //比较字符串 j) size(),length() //返回字符数量 k) max_size() //返回字符的可能最大个数 l) empty() //判断字符串是否为空 m) capacity() //返回重新分配之前的字符容量 n) reserve() //保留一定量内存以容纳一定数量的字符 o) [ ], at() //存取单一字符 p) >>,getline() //从stream读取某值 q) << //将谋值写入stream r) copy() //将某值赋值为一个C_string s) c_str() //将内容以C_string返回 t) data() //将内容以字符数组形式返回 u) substr() //返回某个子字符串

string.h中的函数

string.h中的函数 @函数名称: strdup 函数原型: char *strdup(const char *s) 函数功能: 字符串拷贝,目的空间由该函数分配 函数返回: 指向拷贝后的字符串指针 参数说明: src-待拷贝的源字符串 所属文件: #include #include #include int main() { char *dup_str, *string="abcde"; dup_str=strdup(string); printf("%s", dup_str); free(dup_str); return 0; } @函数名称: strcpy 函数原型: char* strcpy(char* str1,char* str2); 函数功能: 把str2指向的字符串拷贝到str1中去 函数返回: 返回str1,即指向str1的指针 参数说明: 所属文件: #include #include int main() { char string[10]; char *str1="abcdefghi"; strcpy(string,str1); printf("the string is:%s\n",string); return 0; } @函数名称: strncpy 函数原型: char *strncpy(char *dest, const char *src,int count) 函数功能: 将字符串src中的count个字符拷贝到字符串dest中去

Android的String用法

String : 字符串类型 一、构造函数 String(byte[ ]bytes):通过byte数组构造字符串对象。 String(char[ ]value):通过char数组构造字符串对象。 String(Sting original):构造一个original的副本。即:拷贝一个original。 String(StringBuffer buffer):通过StringBuffer数组构造字符串对象。 例如: byte[] b = {'a','b','c','d','e','f','g','h','i','j'}; char[] c = {'0','1','2','3','4','5','6','7','8','9'}; String sb = new String(b); //abcdefghij String sb_sub = new String(b,3,2); //de String sc = new String(c); //0123456789 String sc_sub = new String(c,3,2); //34 String sb_copy = new String(sb); //abcdefghij System.out.println("sb:"+sb); System.out.println("sb_sub:"+sb_sub); System.out.println("sc:"+sc); System.out.println("sc_sub:"+sc_sub); System.out.println("sb_copy:"+sb_copy); 输出结果:sb:abcdefghij sb_sub:de sc:0123456789 sc_sub:34 sb_copy:abcdefghij 二、方法: 说明:①、所有方法均为public。 ②、书写格式:[修饰符] <返回类型><方法名([参数列表])> 例如:static int parseInt(String s) 表示此方法(parseInt)为类方法(static),返回类型为(int),方法所需要为String类型。 1. char charAt(int index):取字符串中的某一个字符,其中的参数index指的是字符串中序数。字符串的序数从0开始到length()-1 。 例如:String s = new String("abcdefghijklmnopqrstuvwxyz"); System.out.println("s.charAt(5): " + s.charAt(5) ); 结果为:s.charAt(5): f 2.int compareTo(String anotherString):当前String对象与anotherString比较。相等关系返回0;不相等时,从两个字符串第0个字符开始比较,返回第一个不相等的字符差,另一种情况,较长字符串的前面部分恰巧是较短的字符串,返回它们的长度差。 3. int compareTo(Object o) :如果o是String对象,和2的功能一样;否则抛出ClassCastException异常。 例如:String s1 = new String("abcdefghijklmn"); String s2 = new String("abcdefghij"); String s3 = new String("abcdefghijalmn"); System.out.println("https://www.360docs.net/doc/6012148762.html,pareTo(s2): " + https://www.360docs.net/doc/6012148762.html,pareTo(s2) ); //返回长度差

相关文档
最新文档