定义

字符串由一对双引号或单引号来表示。

  1. > print("a" .. 'b')
  2. ab

string不可修改

  1. local a= "this is a";
  2. a = "this is new a ";
  3. local b= "this is new a ";

1)在 Lua 实现中,Lua 字符串一般都会经历一个“内化”(intern)的过程,即两个完全一样的 Lua 字符串在 Lua 虚拟机中只会存储一份。每一个 Lua 字符串在创建时都会插入到 Lua 虚拟机内部的一个全局的哈希表中。
2)Lua 的字符串是不可改变的值,不能像在c语言中那样直接修改字符串的某个字符,而是根据修改要求来创建一个新的字符串。Lua 也不能通过下标来访问字符串的某个字符。
Lua的字符串和其它对象都是自动内存管理机制所管理的对象,不需要担心字符串的内存分配和释放
提供了效率,安全

  1. s='123456789';
  2. s1 = s;
  3. s='abcdwff';
  4. print(s);
  5. print(s1);
  6. s='123456789'
  7. local s1 = string.sub(s, 2, 5)
  8. print(s)

连接

使用操作符..(两个点) 可以实现字符串连接

  1. print("hello".." world")

输出结果

  1. hello world

长度

使用 # 来计算字符串的长度,放在字符串前面

  1. print(#"this is string")

转换

数字转换

字符串与number类型转换

  1. print(tonumber("10") == 10)
  2. print(tostring(10) == "10")

大小写

string.upper(argument) 字符串全部转为大写字母。
string.lower(argument) 字符串全部转为小写字母。
  1. str ="Hello World"
  2. print(string.lower(str))
  3. print(string.upper(str))

输出结果

  1. hello world
  2. HELLO WORLD

查找

  1. print(string.find("Hello Lua","Lua"))
  2. print(string.find("Hello Lua","Hello",5))

输出结果,第三个参数表示从字符串哪里开始搜索;它的默认值是1,就是开头查找

  1. 7 9
  2. nil

排序

  1. letters ={"d","a","c","g"}
  2. table.sort(letters)
  3. for k,v in ipairs(letters)do
  4. print(k,v)
  5. end

输出结果

  1. 2 c
  2. 3 d
  3. 4 g

匹配模式

Lua 中的匹配模式直接用常规的字符串来描述。 它用于模式匹配函数 string.find, string.gmatch, string.gsub, string.match
你还可以在模式串中使用字符类。
字符类指可以匹配一个特定字符集合内任何字符的模式项。比如,字符类 %d 匹配任意数字。所以你可以使用模式串 %d%d/%d%d/%d%d%d%d 搜索 dd/mm/yyyy 格式的日期:
eg:

  1. s = "Buy buy buy is 2020/11/11"
  2. date = "%d%d%d%d/%d%d/%d%d"
  3. print(string.sub(s, string.find(s, date)))

输出结果

  1. 2020/11/11

下面的表列出了Lua支持的所有字符类:
单个字符(除 ^$()%.[]*+-? 外): 与该字符自身配对

  • .(点): 与任何字符配对
  • %a: 与任何字母配对
  • %c: 与任何控制符配对(例如\n)
  • %d: 与任何数字配对
  • %l: 与任何小写字母配对
  • %p: 与任何标点(punctuation)配对
  • %s: 与空白字符配对
  • %u: 与任何大写字母配对
  • %w: 与任何字母/数字配对
  • %x: 与任何十六进制数配对
  • %z: 与任何代表0的字符配对
  • %x(此处x是非字母非数字字符): 与字符x配对. 主要用来处理表达式中有功能的字符(^$()%.[]*+-?)的配对问题, 例如%%与%配对
  • [数个字符类]: 与任何[]中包含的字符类配对. 例如[%w]与任何字母/数字, 或下划线符号()配对
  • [^数个字符类]: 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对

当上述的字符类用大写书写时, 表示与非此字符类的任何字符配对.
%S表示与任何非空白字符配对
%A非字母的字符

  1. print(string.gsub("hello, up-down!", "%A", "."))

输出结果,数字4不是字符串结果的一部分,他是gsub返回的第二个结果,代表发生替换的次数。

  1. hello..up.down. 4

特殊字符

在模式匹配中有一些特殊字符,他们有特殊的意义,Lua中的特殊字符如下:

  1. ( ) . % + - * ? [ ^ $

‘%’ 用作特殊字符的转义字符,因此 ‘%.’ 匹配点;’%%’ 匹配字符 ‘%’。转义字符 ‘%’不仅可以用来转义特殊字符,还可以用于所有的非字母的字符。
eg:

  1. s = "Buy buy buy is 2020-11-11"
  2. date = "%d%d%d%d%-%d%d%-%d%d"
  3. print(string.sub(s, string.find(s, date)))

输出结果

  1. 2020-11-11

模式条目可以是:

  • 单个字符类匹配该类别中任意单个字符;
  • 单个字符类跟一个 ‘*‘, 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串;
  • 单个字符类跟一个 ‘+‘, 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串;
  • 单个字符类跟一个 ‘-‘, 将匹配零或更多个该类的字符。 和 ‘*‘ 不同, 这个条目总是匹配尽可能短的串;
  • 单个字符类跟一个 ‘?‘, 将匹配零或一个该类的字符。 只要有可能,它会匹配一个;
  • %_n_, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。
  • %b_xy_, 这里的 xy 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 xy 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个x+1 ,读到一个 y-1, 最终结束处的那个 y 是第一个记数到 0 的 y。 举个例子,条目 %b() 可以匹配到括号平衡的表达式。
  • %f[_set_], 指 边境模式; 这个条目会匹配到一个位于 set 内某个字符之前的一个空串, 且这个位置的前一个字符不属于 set 。 集合 set 的含义如前面所述。 匹配出的那个空串之开始和结束点的计算就看成该处有个字符 ‘\0‘ 一样。

模式:
模式 指一个模式条目的序列。 在模式最前面加上符号 ‘^‘ 将锚定从字符串的开始处做匹配。 在模式最后面加上符号 ‘$‘ 将使匹配过程锚定到字符串的结尾。 如果 ‘^‘ 和 ‘$‘ 出现在其它位置,它们均没有特殊含义,只表示自身。
捕获:
模式可以在内部用小括号括起一个子模式; 这些子模式被称为 捕获物。 当匹配成功时,由 捕获物 匹配到的字符串中的子串被保存起来用于未来的用途。 捕获物以它们左括号的次序来编号。 例如,对于模式 "(a*(.)%w(%s*))" , 字符串中匹配到 "a*(.)%w(%s*)" 的部分保存在第一个捕获物中 (因此是编号 1 ); 由 “.“ 匹配到的字符是 2 号捕获物, 匹配到 “%s*“ 的那部分是 3 号。
作为一个特例,空的捕获 () 将捕获到当前字符串的位置(它是一个数字)。 例如,如果将模式 "()aa()" 作用到字符串"flaaap" 上,将产生两个捕获物: 3 和 5 。

运算符

操作符 描述 实例
.. 连接两个字符串 a..b ,其中 a 为 “Hello “ , b 为 “World”, 输出结果为 “Hello World”。
# 一元运算符,返回字符串或表的长度。 #”Hello” 返回 5