首页 > 代码库 > Lua 字符串库函数总结
Lua 字符串库函数总结
字符串库
注:字符串在Lua中是不可变的,任何的string操作都不会去改变原有的字符串,都是返回新的字符串
一、一般函数
1. 求长度
s = "Hello LUA ";
print(string.len(s));
print(#s);
2. 重复
print(string.rep(s,3)); -- s 重复了3次
3. 大小写转换
print(string.upper(s));
print(string.lower(s));
-- 大小写的一个典型用途,假如要对一个字符串进行比较,不区分大小写
table.sort(a, function(a,b) return string.lower(a) < string.lower(b); end);
print(s); -- 没有改变过,Lua中字符串是不可改变的。
4. 截取子串
s = "[Hello]";
print(string.sub(s,2,-2)); -- 这样就去掉了头和尾,负数表示从最后开始索引,-1表示最后一个
5. 格式化输出
print(string.format("pi = %.4f",math.pi));
print(string.format("%d",12.345));
二、模式匹配
1. 查找
s = "Hello World Hello";
i, j = string.find(s,"Hello");
print(i,j, string.sub(s,i,j));
i, j = string.find(s,"Hello",2); -- 第三个参数表示从哪里开始搜索
print(i,j, string.sub(s,i,j));
2. string.match 可用于模糊匹配
date = "Today is 17/7/1990";
d = string.match(date,"%d+/%d+/%d+"); -- 返回查到结果
print(d);
3. 替换
s = "Lua is cute very cute";
print(string.gsub(s,"cute","great")); --返回替换后的字符串和替换的次数
print(string.gsub(s,"cute","great",1)); -- 第四个参数限制替换的次数
4. select() 在多个返回值中,获取指定的值
s = "Hi I am Lua ha ha";
count = select(2, string.gsub(s," "," ")); -- 用select获取第二个值
print(count); -- 获取空格的数目
5. string.gmatch函数, 会返回一个函数,通过遍历这个函数,可以获取所有匹配到的元素
words = {};
for w in string.gmatch(s, "%a+") do -- "%a+" 匹配一个或多个字母字符序列
print(w);
words[#words+1]=w;
end;
6. Lua的字符串匹配模式符
. 表示全部字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%u 大写字母
%p 标点符号
%s 空白字符
%w 字母和数字
%x 十六进制数字
%z 内部表示为0 字符
模式的修饰符,
+ 表示尽可能多的扩展
- 表示尽可能少的扩展
大写形式表示它们的补集,如 %A 表示匹配所有非字符字符
7. .+ 和 .- 的区别
-- 查找C程序的注释
test = "int x; /* x */ int y; /* y */";
print(string.gsub(test, "/%*.+%*/","<comment>")); -- .+会尽可能地扩展,直到最后一个
print(string.gsub(test, "/%*.-%*/","<comment>")); -- .-会匹配最近的一个
示例:
s = "H1e2l34lo 6LU7A";
print(string.gsub(s,"%A"," ")); -- 把所有非字母的都替换为空格
s = "-2334 44";
print(string.gsub(s,"[+-]?%d+","")); --"[+-]?%d+" [+-]? 表示可选的,即可以是 -12 或是 12
print(string.gsub(s,"%d+",""));
--用%b来匹配成对的字符
s = "Hi [Lua] end";
print(string.gsub(s,"%b[]","#")); -- []这部分被替换掉
三、捕获
1. 匹配结果的拆分,当匹配信息放在圆括号中时,如果发现匹配,就能捕获并返回
date = "Today is 09/05/2014";
print(string.match(date,"%d+/%d+/%d+"));
print(string.match(date,"(%d+)/(%d+)/(%d+)")); -- 加上() ,返回的结果被分割开了。
2. 可用 %数字 来表示比配到的数值, %0表示全部, %1 表示匹配到的第一个
-- 简单格式转换器
s = "\command{some text}";
print(string.gsub(s, "(%a+){(.-)}", "<%1>%2</%1>"));
3. 剔除两端空格
s = " Hi ";
print(string.gsub(s, "^%s*(.-)%s*$","%1")); -- (.-) 会试图匹配尽可能少的内容
4. 替换, 会将$varname 替换为对应的全局变量, 没有,则不替换
function expand(s)
return (string.gsub(s,"$(%w+)",_G));
end;
name = "lua";
status= "great";
print(expand("$name is $status ? $yes"));
5. 定义自己的字符分类, 用[]
-- 匹配 !@# 的内容
s = "fta!asdf@s[df#asdf]##asdf!!";
print(string.gsub(s,"[!@#]","__"));
6. 头尾匹配,^会匹配开头部分,$会匹配结尾部分
s = "-100a";
print(string.gsub(s, "^[+-]?%d+", " "));
print(string.gsub(s, "^[+-]?%d+$", " ")); -- 检测字符串是否为数字
s = "11111!";
注:字符串在Lua中是不可变的,任何的string操作都不会去改变原有的字符串,都是返回新的字符串
一、一般函数
1. 求长度
s = "Hello LUA ";
print(string.len(s));
print(#s);
2. 重复
print(string.rep(s,3)); -- s 重复了3次
3. 大小写转换
print(string.upper(s));
print(string.lower(s));
-- 大小写的一个典型用途,假如要对一个字符串进行比较,不区分大小写
table.sort(a, function(a,b) return string.lower(a) < string.lower(b); end);
print(s); -- 没有改变过,Lua中字符串是不可改变的。
4. 截取子串
s = "[Hello]";
print(string.sub(s,2,-2)); -- 这样就去掉了头和尾,负数表示从最后开始索引,-1表示最后一个
5. 格式化输出
print(string.format("pi = %.4f",math.pi));
print(string.format("%d",12.345));
二、模式匹配
1. 查找
s = "Hello World Hello";
i, j = string.find(s,"Hello");
print(i,j, string.sub(s,i,j));
i, j = string.find(s,"Hello",2); -- 第三个参数表示从哪里开始搜索
print(i,j, string.sub(s,i,j));
2. string.match 可用于模糊匹配
date = "Today is 17/7/1990";
d = string.match(date,"%d+/%d+/%d+"); -- 返回查到结果
print(d);
3. 替换
s = "Lua is cute very cute";
print(string.gsub(s,"cute","great")); --返回替换后的字符串和替换的次数
print(string.gsub(s,"cute","great",1)); -- 第四个参数限制替换的次数
4. select() 在多个返回值中,获取指定的值
s = "Hi I am Lua ha ha";
count = select(2, string.gsub(s," "," ")); -- 用select获取第二个值
print(count); -- 获取空格的数目
5. string.gmatch函数, 会返回一个函数,通过遍历这个函数,可以获取所有匹配到的元素
words = {};
for w in string.gmatch(s, "%a+") do -- "%a+" 匹配一个或多个字母字符序列
print(w);
words[#words+1]=w;
end;
6. Lua的字符串匹配模式符
. 表示全部字符
%a 字母
%c 控制字符
%d 数字
%l 小写字母
%u 大写字母
%p 标点符号
%s 空白字符
%w 字母和数字
%x 十六进制数字
%z 内部表示为0 字符
模式的修饰符,
+ 表示尽可能多的扩展
- 表示尽可能少的扩展
大写形式表示它们的补集,如 %A 表示匹配所有非字符字符
7. .+ 和 .- 的区别
-- 查找C程序的注释
test = "int x; /* x */ int y; /* y */";
print(string.gsub(test, "/%*.+%*/","<comment>")); -- .+会尽可能地扩展,直到最后一个
print(string.gsub(test, "/%*.-%*/","<comment>")); -- .-会匹配最近的一个
示例:
s = "H1e2l34lo 6LU7A";
print(string.gsub(s,"%A"," ")); -- 把所有非字母的都替换为空格
s = "-2334 44";
print(string.gsub(s,"[+-]?%d+","")); --"[+-]?%d+" [+-]? 表示可选的,即可以是 -12 或是 12
print(string.gsub(s,"%d+",""));
--用%b来匹配成对的字符
s = "Hi [Lua] end";
print(string.gsub(s,"%b[]","#")); -- []这部分被替换掉
三、捕获
1. 匹配结果的拆分,当匹配信息放在圆括号中时,如果发现匹配,就能捕获并返回
date = "Today is 09/05/2014";
print(string.match(date,"%d+/%d+/%d+"));
print(string.match(date,"(%d+)/(%d+)/(%d+)")); -- 加上() ,返回的结果被分割开了。
2. 可用 %数字 来表示比配到的数值, %0表示全部, %1 表示匹配到的第一个
-- 简单格式转换器
s = "\command{some text}";
print(string.gsub(s, "(%a+){(.-)}", "<%1>%2</%1>"));
3. 剔除两端空格
s = " Hi ";
print(string.gsub(s, "^%s*(.-)%s*$","%1")); -- (.-) 会试图匹配尽可能少的内容
4. 替换, 会将$varname 替换为对应的全局变量, 没有,则不替换
function expand(s)
return (string.gsub(s,"$(%w+)",_G));
end;
name = "lua";
status= "great";
print(expand("$name is $status ? $yes"));
5. 定义自己的字符分类, 用[]
-- 匹配 !@# 的内容
s = "fta!asdf@s[df#asdf]##asdf!!";
print(string.gsub(s,"[!@#]","__"));
6. 头尾匹配,^会匹配开头部分,$会匹配结尾部分
s = "-100a";
print(string.gsub(s, "^[+-]?%d+", " "));
print(string.gsub(s, "^[+-]?%d+$", " ")); -- 检测字符串是否为数字
s = "11111!";
print(string.gsub(s, "%p+$", " ")); -- 匹配是否以标点符号结尾,如果是的话,将标点符号去掉
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。