#!/usr/bin/lua
-- 字符串格式化
--[[
string.format()
原型:string.format (formatstring, ···)
解释:返回第一个参数描述之后的参数的格式化版本,第一个参数必须为字符串,是对结果字符串的一种描述,
这个格式化的字符串和C语言的printf()一族的函数遵循相同的规则,仅有的不同体现在参数选项的修改,
其中参数描述符*,l,L,p和h不再支持,但是多了一个额外的选项q,这个q选项会以一种适合lua解释器安全读取的方式来格式化字符串:
被写在双引号之间的字符串包括双引号、换行、空字符('\0'或NULL)、反斜杠在被格式化时都能被正确的分离出来。
格式控制符以%开头,常用的有以下几种
%c - 接受一个数字,并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式,使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式,使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式,使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式,使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E,对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%号后添加参数.参数将以如下的顺序读入:
(1) 符号:一个+号表示其后的数字转义符将让正数显示正号.默认情况下只有负数显示符号.
(2) 占位符: 一个0,在后面指定了字串宽度时占位用.不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时,默认为右对齐,增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切:在宽度数值后增加的小数部分n,若后接f(浮点数转义符,如%6.3f)则设定该浮点数的小数只保留n位,
若后接s(字符串转义符,如%5.3s)则设定该字符串只显示前n位.
]]
print(string.format("---[%c]--",65)) -- 接受一个十进制数字,将其转化成ASCII码表中对应的字符(65 == A)
print(string.format("---[%d]--",15)) -- 打印数字15
print(string.format("---[%o]--",9)) -- 打印数字011
print(string.format("---[%u]--",12)) -- 打印数字12
print(string.format("---[%08x]--",47)) -- 打印0000002f
#!/usr/bin/lua
-- 字符串替换
--[[
string.gsub()
原型:string.gsub (s, pattern, repl [,m])
参数说明:
s 源字符串
pattern 模式串
repl 替换串
返回值:返回一个和pattern匹配,并且用rep1替换的副本。第二个返回值n是代表匹配的个数。
pattern说明
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表 0的字符
特殊字符如下:
(). % + - * ? [] ^ $
() 分组
% 也作为以上特殊字符的转义字符
+ 匹配前一字符 1 次或多次,最长匹配
* 匹配前一字符 0 次或多次,最长匹配
- 匹配前一字符 0 次或多次,最短匹配
? 匹配前一字符 0 次或 1次
repl说明
这个函数会返回一个替换后的副本,原串中所有的符合参数pattern的子串都将被参数repl所指定的字符串所替换,如果指定了参数m,那么只替换查找过程的前m个匹配的子串,
参数repl可以是一个字符串、表、或者是函数,并且函数可以将匹配的次数作为函数的第二个参数返回,接下来看看参数repl的含义:
如果参数repl是一个常规字符串,成功匹配的子串会被repl直接替换,如果参数repl中包含转移字符%,
那么可以采用%n的形式替换,当%n中的n取值1-9时,表示一次匹配中的第n个子串,当其中的n为0时,表示这次匹配的整个子串,%%表示一个单独的%。
如果参数repl是一个表,那么每次匹配中的第一个子串将会作为整个表的键,取table[匹配子串]来替换所匹配出来的子串,
当匹配不成功时,函数会使用整个字符串来作为table的键值。
如果参数repl是一个函数,那么每一次匹配的子串都将作为整个函数的参数,取function(匹配子串)来替换所匹配出来的子串,
当匹配不成功时,函数会使用整个字符串来作为函数的参数。如果函数的返回值是一个数字或者是字符串,那么会直接拿来替换,
如果它返回false或者nil,替换动作将不会发生,如果返回其他的值将会报错。
]]
local p = "int x; /* x */ int y; /* y */"
-- 匹配注释
print(string.gsub(p,"/%*.-%*/","##"))
-- 测试函数模式
local str="abcdefg"
string.gsub(str,"%l",function(ch)
print(ch)
end)
--print(string.byte(str))
#!/usr/bin/lua
-- string.find(s, pattern [, init [, plain]] )
-- s: 源字符串
-- pattern: 待搜索模式串
-- init: 可选, 起始位置
--[[
pattern说明
. 任意字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%p 标点字符
%s 空白符
%u 大写字母
%w 字母和数字
%x 十六进制数字
%z 代表 0的字符
特殊字符如下:
(). % + - * ? [] ^ $
() 分组
% 也作为以上特殊字符的转义字符
+ 匹配前一字符 1 次或多次,最长匹配
* 匹配前一字符 0 次或多次,最长匹配
- 匹配前一字符 0 次或多次,最短匹配
? 匹配前一字符 0 次或 1次
]]
local start1,last1 = string.find("hello this world .","wor")
-- 返回起始位置和截止位置
print("start1=",start1)
print("last1=",last1)
-- 注意: lua 里面数组或者字符串的字符, 其下标索引是从 1 开始, 不是 0
local start2,last2 = string.find("hello this 21 world .","[0-9]+")
print("start2=",start2)
print("last2=",last2)