Lua 字符串相关操作

#!/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)

猜你喜欢

转载自www.cnblogs.com/zhanggaofeng/p/12978129.html