最近一直使用到string,因此干脆对lua字符串的用法进行系统性的梳理
一、Lua 字符串
1、Lua 语言中字符串可以使用以下三种方式来表示:
- 单引号间的一串字符。 “a”
- 双引号间的一串字符。 ‘b’
- [[ 与 ]] 间的一串字符。 [[c]]
但是一般在实际应用中都是用“”,跟其他语言保持一致
2、Lua并没有字符类型,Lua的string类型表示字符序列。所以,长度为1的string就表示了单个字符
我之前习惯了C#,在C#中字符都是用单引号引来的,使用char/Char类定义,比如char ch1 = ‘m’ ; 切记,单引号中只能是储存一个字符,这种情况是错误的 char ch1 = ‘abc’; (×)
但是在Lua中就没有char,单个字符就是string a = “a”
3、Lua提供运行时数字和字符的自动转换。即一个数字和一个字符串相加,Lua会尝试把这个字符串转换成数字再求值。不需要我们显式转换![在这里插入图片描述](https://img-blog.csdnimg.cn/f708b2772ace4ae296be2fd5423f7ef3.png)
但是实际应用中我发现项目上在运算的时候还是会转换成number
4、长度操作符“#”,可用于求字符串的长度,即字符串包含的字符数
在平时开发过程中不建议使用#来直接获取table的元素个数,因为有坑!
local tab = {
}
tab[1] = nil
tab[2] = 1
tab[3] = 2
print(#tab)
--结果为0
#号得到的是用整数作为索引的最开始连续部分的大小, 如果t[1] == nil, 即使t[2], t[3]是存在的,#t仍然为零。对于这类tb[1],tb[2]…这种连续的才能获取到正确的长度,中间一断就扑街了
function table.length(t)
local i = 0
for k, v in pairs(t) do
i = i + 1
end
return i
end
一般会另外自己写个方法来遍历
二、Lua string API
我尽量搞的齐全一点
Lua 5.3 参考手册 中关于string库的介绍
1、匹配模式
这是实际工作中最经常用到的
Lua 中的匹配模式直接用常规的字符串来描述。 它用于模式匹配函数
string.find, 查找匹配字符串的开始和结束位置, 未找到就返回nil
string.gmatch, 替换
string.gsub, 返回第1个匹配的字符串
string.match 返回所有匹配字符串的迭代器
字符类 用于表示一个字符集合。 下列组合可用于字符类:
- x: (这里 x 不能是 魔法字符 ^$()%.[]*±? 中的一员) 表示字符 x 自身。
- .: (一个点)可表示任何字符。
- %a: 表示任何字母。
- %c: 表示任何控制字符。
- %d: 表示任何数字。
- %g: 表示任何除空白符外的可打印字符。
- %l: 表示所有小写字母。
- %p: 表示所有标点符号。
- %s: 表示所有空白字符。
- %u: 表示所有大写字母。
- %w: 表示所有字母及数字。
- %x: 表示所有 16 进制数字符号。
- %x: (这里的 x 是任意非字母或数字的字符) 表示字符 x。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个 ‘%’ 放在模式串中表示自身。
所有单个字母表示的类别(%a,%c,等), 若将其字母改为大写,均表示对应的补集。 例如,%S 表示所有非空格的字符。
lua的匹配模式可以看做是功能不完整的正则表达式,只实现了大部分
这些函数都是基于模式匹配的。与其他脚本语言不同的是,Lua并不使用POSIX规范的正则表达式 (也写作regexp)来进行模式匹配。主要的原因出于程序大小方面的考虑:实现一个典型的符合POSIX标准的regexp大概需要4000行代码,这比整个Lua标准库加在一起都大。权衡之下,Lua中的模式匹配的实现只用了500行代码,当然这意味着不可能实现POSIX所规范的所有更能。然而,Lua中的模式匹配功能是很强大的,并且包含了一些使用标准POSIX模式匹配不容易实现的功能。
使用过程中,遇到的不支持的功能:
-
分组匹配多次, 比如: abcabc, 无法用(abc)+匹配到
-
匹配次数范围, 比如: a{1,3}这种, 最少匹配1次,最多匹配3次
2、string.find(str, pattern, init, plain) 查找
tring.find的基本应用就是用来在目标串(subject string)内搜索匹配指定的模式的串。函数如果找到匹配的串返回他的位置,否则返回nil.
查找第一个字符串 s 中匹配到的 pattern (参见 §6.4.1)。 如果找到一个匹配,find 会返回 s 中关于它起始及终点位置的索引; 否则,返回 nil。 第三个可选数字参数 init 指明从哪里开始搜索; 默认值为 1 ,同时可以是负值。 第四个可选参数 plain 为 true 时, 关闭模式匹配机制。 此时函数仅做直接的 “查找子串”的操作, 而 pattern 中没有字符被看作魔法字符。 注意,如果给定了 plain ,就必须写上 init
s = "Equipment interface"
local a,b = string.find(s, "Equipment") --> 1 5
local c,d =string.find(s, "interface") --> 7 11
local s,f =string.find(s, "i") --> 3 3
local y,u =string.find(s, "lll") --> nil nil
print(a,b)
print(c,d)
print(s,f)
print(y,u)