Lua程序设计之字符串精要
(摘自Lua程序设计)
基本:
Lua语言的字符串是一串字节组成的序列。
在Lua语言中,字符使用8个比特位来存储。
Lua语言中的字符串可以存储包括空字符在内的所有数值代码,这意味着我们可以在字符串中存储任意的二进制数据。
Lua语言中的字符串是不可变值,我们不能像C语言中那样直接改变某个字符串中的某个字符,但是我们可以通过创建一个新字符串来达到修改的目的。
例如:
a = "one string"
b = string.gsub(a, "one", another)
print(a) ---> one string
print(b) --->another string
像Lua语言中的其他对象一样,Lua语言中的字符串也是自动内存管理的对象之一。这意味着Lua会自动给字符串分配和释放资源,不用开发人员担心。
我们可以使用长度操作符(#)来获取字符串的长度
例如:
a = "hello"
print(#a) ---> 5
print(#"good bye") --->8
我们可以使用连接操作符..(两个点)来进行字符串的连接,如果操作符中存在数值,那么Lua会把数值转换成字符串。
例如:
"Hello " .. "World" ---> Hello World
"result is " .. 3 ---> result is 3
字符串是不可变量。字符串连接总是创建一个新字符串,而不会改变作为操作数的字符串。
字符串常量
我们可以使用一对双引号或单引号来声明字符串常量
a = "a line"
b = 'another line'
他们两者唯一的区别在于,使用双引号声明的字符串中出现单引号时,单引号可以不用转义;同理,使用单引号声明的字符串中出现双引号时,双引号不用转义。
Lua语言的字符串支持下列C语言风格的转义字符
\a 响铃
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 反斜杠
\" 双引号
\' 单引号
长字符串/多行字符串
像长注释或多行注释一样,字符串可以使用两个方括号来声明长字符串/多行字符串,并且内容中的转义序列不会被转义。
此外,如果多行字符串中的第一个字符是换行符,那么这个换行符将会被忽略。多行字符在声明大段代码时非常方便。
page = [[
<html>
<head>
<head>
</head>
<body>
</body>
</html>
]]
有时字符串中可能有类似 a = b[c[i]]这样的内容(注意]]),或者字符串中可能有注释掉的代码。为了应对这些情况,可以在两个左方括号之间加上任意数量的等号,如[===[。这样,字符串常量只有在遇到了包含相等数量等号的两个右方括号时才会结束,即]===]。这种方法对注释同样有效。
强制转换类型
Lua在运行时提供了数值与字符串之间的自动转换。针对字符串的所有算术操作会尝试将字符串转换为数值。
Lua不仅仅在算术操作时进行这种强制类型的转换。还会在任何需要数值的情况下进行,例如函数math.sin
相反,当Lua语言发现在需要字符串的地方出现数值时,会自动把数值转换为字符串。
print(10 .. 20)
当在数值后紧接着使用字符串连接时,必须使用空格将他们分开,否则Lua会把第一个点当成小数点。
算术运算的规则就是只有在两个操作数都是整型时,结果才是整型。因此,由于字符串不是整型值,所以字符串参与的算术运算都被当作浮点处理
"10" + 1 ---> 11.0
如果需要显示的将一个字符串转换成数值,那么可以使用函数tonumber。当这个字符串的内容不能表示为有效数字时,该函数返回nil;否则就返回对应的整型或者浮点型。
tonumber(" -3") --> -3
tonumber("10e4") --> 100000.0
tonumber("10e") -->nul
tonumber("0x1.3p-4") -->0.07421875
默认情况下tonumber使用的是十进制,但是也可以指明使用二进制到三十六进制之间的任意进制
tonumber("100101", 2) -->37
tonumber("fff", 16) -->4095
tonumber("987", 8) -->nil
调用函数tostring可以将数值转换成字符串
print(tostring(10) == "10") ---> true
与算术操作符不同,比较操作符不会对操作数进行强制类型转换。请注意,"0"和0是不同的。此外,2<15明显明显为真,但"2" < "15"却为假(字母顺序)。为了避免出现不一致的结果,当比较操作符中混用了字符串和数值时,Lua会抛出异常。
字符串标准库
Lua语言处理字符串的能力完全来自于字符串标准库
一些简单的函数:
string.len(s) --返回字符串s的长度等价于#s
string.rep(s,n) --返回字符串重复n次的结果
string.reverse --用于字符串的翻转
string.lower(s) --返回一份s的副本,其中所有的大写字母都被转换成小写字母,其他字符保持不变
string。upper --与之相反
string.sub(s, i, j) 从字符串s中提取第i个到第j个字符(包括i,j),字符串的第一个索引为1.
该函数也支持负数索引,负数索引从字符串的结尾开始计数。索引-1代表字符串的最后一个字符,以此类推。
string.sub(s, 1, j) 得到的是字符串s中长度为j的前缀
string.sub(s, j, -1)得到的是字符串s中从第j个字符开始的后缀
字符串是不可改变的,若想改变
s = string.sub(s, 2, -2)
string.char()和string.byte()用于转换字符及其内部数值表示,函数string.char接受零个或多个整数作为参数,然后将每个整数转换成对应的字符,最后返回这些字符所连成的字符串
string.byte(s, i)返回字符串s中的第i个字符的内部数值表示,第二个参数是可选的
string.byte(s)返回字符串s中的第一个字符(如果字符串只有一个字符组成,那么就返回这个字符)的内部数值表示。
假定字符使用ASCII表示的:
print(string.char(97)) --> a
i = 99; print(string.char(i, i+1, i+2)) --> cde
print(string.byte("abc")) -->97
print(string.byte("abc", 2)) -->98
print(string.byte("abc, -1")) -->99
调用string.byte(s, i, j)返回索引i到j(包括)之间的所有字符的数值表示
一种常见的写法是{string.byte(s, 1, -1)}该表达式会创建一个由字符串s中的所有字符代码组成的表
函数string.format是用于进行字符串格式化和将数字输出为字符串的强大工具,该函数会返回第一个参数的副本,其中每一个指示符都会被替换为使用对应格式就行格式化后的对应参数。格式化中的指示符和c语言中的类似。
string.format("x = %d", 10) --> x = 10
string.format("x = %x", 200) --> x = c8
string.format("x = %f", 200) --> x = 200.000000
tag, title = "h1", "a title"
string.format("<%s>%s</%s>", tag, title, tag) --> <h1>a title</h1>
在百分号和字母之间可以包含用于控制格式细节的其他选项,例如,可以控制一个浮点数小数点的位数。
print(string.format("pi = %.4f", math.pi)) --> pi = 3.1416
d = 5; m = 11; y = 1990
print(string.format("%02d/%02d/%04d", d, m, y)) --> 05/11/1990
关于更多的指示符参阅C语言printf函数的相关文档。
可以使用冒号操作符像调用字符串的一个方法那样调用字符串标准库中的所有函数。
例如
string.sub(s, i, j) --相当于
s:sub(s, i, j)
string.upper(s) --相当于
s:upper()
函数string.find用于在指定字符串中进行模式搜索
string.find("hello world", "wor") --> 7 9
string.find("hello world", "war") -->nil
如果该函数在指定的字符串中找到了匹配的模式,则返回模式的开始和结束位置,否则返回nil。函数string.gsub()则把所有匹配的模式用另一个字符串替换:
string.gsub("hello world", "l", ".") -->he..o wor.d 3
string.gsub("hello world", "a", ".") -->hello world 0
该函数还会在第二个返回值中返回发生替换的次数
Lua程序设计之字符串精要的更多相关文章
- lua程序设计(一)
摘要:lua程序设计第二版学习笔记 脚本语言的基础语法大都比较简单,这里只列举一些lua独有,或者需要特别注意的语法点. 书中前三章的内容是一些惯常的引言,基础数据类型,运算符等内容,相对简单,这里就 ...
- Lua程序设计之数值
(摘自Lua程序设计) 数值常量 从Lua5.3版本开始Lua语言为数值格式提供了两种选择:被称为integer的64位整形和被称为float的双精度浮点类型(注意,"float" ...
- 关于Lua程序设计{读书笔记}
1.lua中的标识符可以是由任意字母.数字和下划线构成的字符串,但不能以数字开头.2.lua将通常类似"_VALUE"的标识符作为保留标识符3.lua的保留字 and break ...
- Lua 程序设计 (Roberto,Ierusalimschy 著)
1 开始 2 类型与值 3 表达式 4 语句 5 函数 6 深入函数 7 迭代器与泛型for 8 编译,执行与错误 9 协同程序(coroutine) 10 完整的示例 11 数据结构 12 数据文件 ...
- 《Lua程序设计》第3章 表达式 学习笔记
3.1 算术操作符“+”(加法).“-”(减法).“*”(乘法).“/”(除法).“^”(指数).“%”(取模).3.2 关系运算符< > <= >= == ~=3.3 逻辑操 ...
- Lua中的字符串函数库
字符串库中的一些函数是非常简单的: string.len(s) 返回字符串s的长度:string.rep(s, n) 返回重复n次字符串s的串:你使用string.rep( ...
- 《Lua程序设计 第二版》学习笔记一
Lua简介 Lua是一种简单.可拓展.可移植及高效的脚本语言. 开始 Lua之间不需要分隔符 运行方式: Linux下: lua -i prog dofile("lib1.lua" ...
- Lua程序设计入门
在Lua中,一切都是变量,除了关键字.TTMD强大了. 1.注释 -- 表示注释一行 --[[ ]]表示注释一段代码,相当于C语言的/*....*/ 注意:[[ ... ]]表示一段字符串 2.lua ...
- lua 操作中文字符串之截取和长度竖排显示
前言 在游戏中,我们经常会遇到汉字的多行显示,比如名字竖行显示等.如下图: 为了实现上面的效果,lua实现分行是通过 \n 实现的,所以我们需要取出汉字,然后插入 \n 实现分行效果.还有一种就是 ...
随机推荐
- 码云挂了,无法访问gitee
解决方式1.修改dns为114.114.114.114 2.hosts文件添加212.64.62.174 gitee.com
- Linux ifconfig 单网卡配置多网段
1 2 3 4 5 6 7 8 9 10 11 ifconfig eth0 down ifconfig eth0 hw ether 01:02:03:04:05:06 ifconfig eth0 ...
- 数学相关比较 牛顿迭代法求开方 很多个n的平方分之一
牛顿迭代法求开方 牛顿迭代法 作用: 求f(x) = 0 的解 方法:假设任意一点 x0, 求切线与x轴交点坐标x1, 再求切线与x轴交点坐标x2,一直重复,直到f(xn) 与0的差距在一个极小的范围 ...
- HDU1595-find the longest of the shortest-dijkstra+记录路径
Marica is very angry with Mirko because he found a new girlfriend and she seeks revenge.Since she do ...
- spark集群进入 bin 下面目录./spark-shell 出现Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
spark集群启动的时候可以正常,进入 ./spark-shell 就会出现如下错误 配置文件:spark-env.sh export JAVA_HOME=/usr/java/jdk1.7.0_51e ...
- 当class有多个class属性时截取操作
这里是实现以个输入对应的页码就跳转,没有或者为字符情况下弹出不存在对应页面 这里难点就是有currentPage的class属性的截取 $(document).on("click" ...
- 哈理工赛 H-小乐乐学数学 /// 筛法得素数表+树状数组
题目大意: 给定n个数 m个询问 询问l r区间内的孤独数的个数 孤独数的定义为在该区间内与其他所有数互质的数 看注释 #include <bits/stdc++.h> using nam ...
- json对象数组的创建、遍历、添加、删除、修改、js的splice()用法
本文链接:https://blog.csdn.net/houfengfei668/article/details/79843625 )第二种方式:手动构造json对象数组 )for )用splice方 ...
- 树形结构_红黑树:平衡2X 哈夫曼树:最优2X
红黑树:平衡2X 哈夫曼树:最优2X 红黑树 :TreeSet.TreeMap 哈夫曼树 1. 将w1.w2.…,wn看成是有n 棵树的森林(每棵树仅有一个结点): 2. 在森林中选出根结点的权值最小 ...
- React和vue的差异和相似地方
React 单向绑定(加插件后,还是可以双向绑定) Vue 双向绑定 组件化 1. React,需要编写render函数, 2. 当React状态的状态state改变是render就会重新被调用, 重 ...