Step By Step(Lua字符串库)
字符串库中有一些函数非常简单,如:
1). string.len(s) 返回字符串s的长度;
2). string.rep(s,n) 返回字符串s重复n次的结果;
3). string.lower(s) 返回s的副本,其中所有的大写都被转换为了小写形式,其他字符不变;
4). string.upper(s) 和lower相反,将小写转换为大写;
5). string.sub(s,i,j) 提取字符串s的第i个到第j个字符。Lua中,第一个字符的索引值为1,最后一个为-1,以此类推,如:
print(string.sub("[hello world]",2,-2)) --输出hello world
6). string.format(s,...) 返回格式化后的字符串,其格式化规则等同于C语言中printf函数,如:
print(string.format("pi = %.4f",math.pi)) --输出pi = 3.1416
7). string.char(...) 参数为0到多个整数,并将每个整数转换为对应的字符。然后返回一个由这些字符连接而成的字符串,如:
print(string.char(97,98,99)) --输出abc
8). string.byte(s,i) 返回字符串s的第i个字符的Ascii值,如果没有第二个参数,缺省返回第一个字符的Ascii值。
print(string.byte("abc")) --输出97
print(string.byte("abc",-1)) --输出99
由于字符串类型的变量都是不可变类型的变量,因此在所有和string相关的函数中,都无法改变参数中的字符串值,而是生成一个新值返回。
2. 模式匹配函数:
Lua的字符串库提供了一组强大的模式匹配函数,如find、match、gsub和gmatch。
1). string.find函数:
在目标字符串中搜索一个模式,如果找到,则返回匹配的起始索引和结束索引,否则返回nil。如:
1 s = "hello world"2 i, j = string.find(s,"hello") 3 print(i, j) --输出1 54 i, j = string.find(s,"l")5 print(i, j) --输出3 36 print(string.find(s,"lll")) --输出nil
1 local t = {}2 local i = 03 while true do4 i = string.find(s,"\n",i+1)5 if i == nil then6 break7 end8 t[#t + 1] = i9 end
该函数返回目标字符串中和模式字符串匹配的部分。如:
1 date = "Today is 2012-01-01"2 d = string.match(date,"%d+\-%d+\-%d+")3 print(d) --输出2012-01-01
该函数有3个参数,目标字符串、模式和替换字符串。基本用法是将目标字符串中所有出现模式的地方替换为替换字符串。如:
print(string.gsub("Lua is cute","cute","great")) --输出Lua is great
该函数还有可选的第4个参数,即实际替换的次数。
print(string.gsub("all lii","l","x",1)) --输出axl lii
print(string.gsub("all lii","l","x",2)) --输出axx lii
函数string.gsub还有另一个结果,即实际替换的次数。
count = select(2, string.gsub(str," "," ")) --输出str中空格的数量
4). string.gmatch函数:
返回一个函数,通过这个返回的函数可以遍历到一个字符串中所有出现指定模式的地方。如:
1 words = {}2 s = "hello world"3 for w in string.gmatch(s,"%a+") do4 print(w)5 words[#words + 1] = w6 end7 --输出结果为:8 --hello9 --world
下面的列表给出了Lua目前支持的模式元字符;
模式元字符 | 描述 |
. | 所有字符 |
%a | 字母 |
%c | 控制字符 |
%d | 数字 |
%l | 小写字母 |
%p | 标点符号 |
%s | 空白字符 |
%u | 大写字母 |
%w | 字母和数字字符 |
%x | 十六进制数字 |
%z | 内部表示为0的字符 |
print(string.gsub("hello, up-down!","%S",".")) --输出hello..up.down. 4
上例中的4表示替换的次数。
除了上述元字符之外,Lua还提供了另外几个关键字符。如:( ) . % + - * ? [ ] ^ $
其中%表示转义字符,如%.表示点(.),%%表示百分号(%)。
方括号[]表示将不同的字符分类,即可创建出属于自己的字符分类,如[%w_]表示匹配字符、数字和下划线。
横线(-)表示连接一个范围,比如[0-9A-Z]
如果^字符在方括号内,如[^\n],表示除\n之外的所有字符,即表示方括号中的分类的补集。如果^不在方括号内,则表示以后面的字符开头,$和它正好相反,表示以前面的字符结束。如:^Hello%d$,匹配的字符串可能为Hello1、Hello2等。
在Lua中还提供了4种用来修饰模式中的重复部分,如:+(重复1次或多次)、*(重复0次或多次)、-(重复0次或多次)和?(出现0或1次)。如:
print(string.gsub("one, and two; and three","%a+","word")) --输出word, word word; word word
print(string.match("the number 1298 is even","%d+")) --输出1298
星号(*)和横线(-)的主要差别是,星号总是试图匹配更多的字符,而横线则总是试图匹配最少的字符。
4. 捕获(capture):
捕获功能可根据一个模式从目标字符串中抽出匹配于该模式的内容。在指定捕获是,应将模式中需要捕获的部分写到一对圆括号内。对于具有捕获的模式,函数string.match会将所有捕获到的值作为单独的结果返回。即它会将目标字符串切成多个捕获到的部分。如:
1 pair = "name = Anna"2 key,value = string.match(pair,"(%a+)%s*=%s*(%a+)")3 print(key,value) --输出name anna4 5 date = "Today is 2012-01-02"6 y,m,d = string.match(date,"(%d+)\-(%d+)\-(%d+)")7 print(y,m,d) --输出2012 01 02
1 print(string.gsub("hello Lua","(.)(.)","%2%1")) --将相邻的两个字符对调,输出为ehll ouLa2 print(string.gsub("hello Lua!","%a","%0-%0")) --输出为h-he-el-ll-lo-o L-Lu-ua-a!
5. 替换:
string.gsub函数的第三个参数不仅可以是字符串,也可以是函数或table,如果是函数,string.gsub会在每次找到匹配时调用该函数,调用时的参数就是捕获到的内容,而该函数的返回值则作为要替换的字符串。当用一个table来调用时,string.gsub会用每次捕获到的内容作为key,在table中查找,并将对应的value作为要替换的字符串。如果table中不包含这个key,那么string.gsub不改变这个匹配。如:
1 function expand(s) 2 return (string.gsub(s,"$(%w+)",_G)) 3 end 4 5 name = "Lua"; status = "great" 6 print(expand("$name is $status, isn't it?")) --输出 Lua is great, isn't it? 7 print(expand("$othername is $status, isn't it?")) --输出 $othername is great, isn't it? 8 9 function expand2(s)10 return (string.gsub(s,"$(%w+)",function(n) return tostring(_G[n]) end))11 end12 13 print(expand2("print = $print; a = $a")) --输出 print = function: 002B77C0; a = nil
转载于:https://blog.51cto.com/zgame/1144316
Step By Step(Lua字符串库)相关推荐
- string返回第n个字符_Programming in Lualua学习第13期 Lua字符串库
微信公众号:GameToolDev 关注可了解更多的游戏工具开发教程.问题或建议,请公众号留言; 1. 基础字符串函数: 字符串库中有一些函数非常简单,如: 1). string.len( ...
- Lua字符串库中的几个重点函数介绍
在<Lua中的一些库>中也说到了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种 ...
- muduo网络库源码阅读Step by Step
Posted on: Nov 26 2015 Categories: muduo C++ Tags: muduo 一般写服务端程序都需要有一个称手的网络库来帮我们处理琐碎的网络通信细节,比如连接的建立 ...
- 第五章 常用Lua开发库2-JSON库、编码转换、字符串处理
JSON库 在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能:目前Lua也有几个JSON库,本人用过cjson.dkjson.其中cjson的 ...
- 转 Lua标准库: table函数, 数学函数, 字符串函数/格式化/配对, WoW新增函数, 函数别名...
这里只介绍和插件编写比较有关的几个函数. 详细的Lua手册请参照Lua Reference Manual 5.1. assert(value) - 检查一个值是否为非nil, 若不是则(如果在wow. ...
- lua字符串转数组_深入Lua:字符串管理
Lua的字符串对象表示为下面结构: typedef struct TString {CommonHeader;// 字符串的子类型有两种:长字符串和短字符串// 短字符串:extra表示Lua保留字的 ...
- Enterprise Library Step By Step系列(十六):使用AppSetting Application Block
Enterprise Library Step By Step系列(十六):使用AppSetting Application Block Terrylee,2005年12月07日 概述 AppSett ...
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core-使用.Net Core + Entity FrameWor ...
- 文本分类step by step(二)
(注:如有转载请标明作者:finallyliuyu, 和出处:博客园) <文本分类 step by step(一)> 在<文本分类step by step(一)>中,我们从处理 ...
最新文章
- 基于SSM实现健康食品零售网站
- mysql表引擎修改
- sql2005数据库大全
- FastDFS 安装
- [vue] 你知道vue的模板语法用的是哪个web模板引擎的吗?说说你对这模板引擎的理解
- cmake学习(二)常用变量和常用环境变量
- Vue中使用axios的响应拦截器处理请求失败的情况(处理token过期问题)以及 登录成功跳转回原来页面问题
- Ceres和g2o的配置和使用
- 第3关:HDFS-JAVA接口之上传文件
- 将Tomcat集成到eclipse中并写出第一条web语句
- 今天生意为什么越来越难做,到底真相是什么?
- 【解题报告】Jury Meeting (9.8CF div2)
- 半导体随机存储器(random access memory)
- 关于印发《计算机技术与软件专业技术资格(水平)考试暂行规定》
- java关于Exception(异常)的详解
- SWUSTOJ #67 学生成绩管理
- CentOS6.5--修改系统语言为中文或英文,文件夹切换语言
- 微博做内容和收入来源
- 【CRR-FMM】A Concise Review of Recent Few-shot Meta-learning Methods
- 白话——海明校验码及编码过程