string 学习1

来源:互联网 发布:解放战争诉苦大会 知乎 编辑:程序博客网 时间:2024/04/27 22:32

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数组。

使用table.concat(tab,"分隔符")来合并字符串,这个函数的功能与string.split正好相反。

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
-12
12345
123456789
%d
1
-12
12345
123456789
%6d
#####1
###-12
#12345
123456789
%.4d
0001
-0012
12345
123456789
%6.4d
##0001
#-0012
#12345
123456789
%-4d
1####
-12#
12345
123456789
%04d
0001
-012
12345
123456789
%+d
+1
-12
+12345
+123456789

格式代码
1
.01
.00012345
12345.6789
%f
1.000000
0.010000
0.000123
12345.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
%g
1
0.01
0.00012345
12345.7

格式代码
6.023e23
%f
60229999999999975882752.000000
%10.2e
60229999999999975882752.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 - 时区名或缩写
%% - 文字上的 `%' 字符
原创粉丝点击