(摘自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程序设计之字符串精要的更多相关文章

  1. lua程序设计(一)

    摘要:lua程序设计第二版学习笔记 脚本语言的基础语法大都比较简单,这里只列举一些lua独有,或者需要特别注意的语法点. 书中前三章的内容是一些惯常的引言,基础数据类型,运算符等内容,相对简单,这里就 ...

  2. Lua程序设计之数值

    (摘自Lua程序设计) 数值常量 从Lua5.3版本开始Lua语言为数值格式提供了两种选择:被称为integer的64位整形和被称为float的双精度浮点类型(注意,"float" ...

  3. 关于Lua程序设计{读书笔记}

    1.lua中的标识符可以是由任意字母.数字和下划线构成的字符串,但不能以数字开头.2.lua将通常类似"_VALUE"的标识符作为保留标识符3.lua的保留字 and break ...

  4. Lua 程序设计 (Roberto,Ierusalimschy 著)

    1 开始 2 类型与值 3 表达式 4 语句 5 函数 6 深入函数 7 迭代器与泛型for 8 编译,执行与错误 9 协同程序(coroutine) 10 完整的示例 11 数据结构 12 数据文件 ...

  5. 《Lua程序设计》第3章 表达式 学习笔记

    3.1 算术操作符“+”(加法).“-”(减法).“*”(乘法).“/”(除法).“^”(指数).“%”(取模).3.2 关系运算符< > <= >= == ~=3.3 逻辑操 ...

  6. Lua中的字符串函数库

    字符串库中的一些函数是非常简单的: string.len(s)          返回字符串s的长度:string.rep(s, n)      返回重复n次字符串s的串:你使用string.rep( ...

  7. 《Lua程序设计 第二版》学习笔记一

    Lua简介 Lua是一种简单.可拓展.可移植及高效的脚本语言. 开始 Lua之间不需要分隔符 运行方式: Linux下: lua -i prog dofile("lib1.lua" ...

  8. Lua程序设计入门

    在Lua中,一切都是变量,除了关键字.TTMD强大了. 1.注释 -- 表示注释一行 --[[ ]]表示注释一段代码,相当于C语言的/*....*/ 注意:[[ ... ]]表示一段字符串 2.lua ...

  9. lua 操作中文字符串之截取和长度竖排显示

    前言 在游戏中,我们经常会遇到汉字的多行显示,比如名字竖行显示等.如下图: 为了实现上面的效果,lua实现分行是通过  \n  实现的,所以我们需要取出汉字,然后插入 \n 实现分行效果.还有一种就是 ...

随机推荐

  1. NX二次开发-UFUN创建球UF_MODL_create_sphere1

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> UF_initialize(); //创建球 UF_FEATURE_SIGN ...

  2. Java-Class-C:java.util.HashMap

    ylbtech-Java-Class-C:java.util.HashMap 1.返回顶部 1.1. import java.util.HashMap; import java.util.Map; 1 ...

  3. SPSS单一样本的T检验

    SPSS单一样本的T检验 如果已知总体均数,进行样本均数与总体均数之间的差异显著性检验属于单一样本的T检验.在SPSS中,单一样本的T检验由"One-Sample T Test"过 ...

  4. C/S通信

    一直在考虑写一个服务端和客户端通信的框架,就现在的需求,打算走http协议. 通信方式打算用Key/Value的形式. 这里面其实还是有很多的问题的,这样的一个通信框架其实是SOA的一部分.其他 但是 ...

  5. org.apache.hadoop.hbase.PleaseHoldException: Master is initializing

    电脑换了重新装了下系统,在本机ubuntu 的环境下搭建hadoopCDH4.5 伪分布式.进入Hbase shell,在创建表的时候出现异常如下: ERROR: org.apache.hadoop. ...

  6. 第六天 函数与lambda表达式、函数应用与工具

    一.函数 1.匹配 位置匹配 def func(a,b,c): print(a,b,c) func(c=1,a=2,b=3) 2 3 1 def func(a, b=2, c=3): print(a, ...

  7. 13-Ubuntu-查阅终端命令版本信息和帮助信息

    查看版本信息: 终端命令 --version 查看帮助信息: 终端命令 --help 注: 待查阅的命令 后面有两个减号-- 例:查看终端命令ls的版本和帮助信息 ls --version ls -- ...

  8. vue中解决拖动和点击事件的冲突

    BUG说明: 鼠标上下方向拖拽,如果松开时鼠标位于悬浮按钮上会默认执行click事件,经验证,click事件与mouse事件的执行顺序为onmousedown =>onmouseup => ...

  9. Activiti学习笔记6 — 变量与历史记录

    一. 变量的使用 1.创建流程引擎对象 private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); ...

  10. 【学术篇】SDOI2009 学校食堂

    传送门~ 题目大意 先分析\((x\ or\ y)-(x\ and\ y)\), 就是\(x\)和\(y\)中存在的1减去\(x\)和\(y\)中相同的1 *那不就是\(x\ xor\ y\)么←_← ...