lua string 下的函数

lua的字符串操作

lua的字符串绝大部分的操作 都可以用 string 库函数接口操作,只是因为lua的特性,在匹配操作上会有些不一样,这个文末会说一点。

另外 lua 的字符串是 从 下标 1 开始的,不是 0 开始。

函数操作:

1. 计算字符串长度

  例如:string.len("abcd"); ----> 4

2. 返回字符串 s 的 n 个拷贝

  例如:string.rep("abcd",2) ----> abcdabcd

3. 返回字符串的全部大写

  例如:string.upper("AbcD") ----> ABCD

4. 返回字符串的全部小写

  例如:string.lower("AbcD") ----> abcd

5. 字符串的拼接【字符串的格式化操作】

  例如:string.format("the value is:%d",4) ----> the value is:4

6. 根据下标截取字符串 这个下标是取的 闭区间长度 ,string.sub(info, index, endindex)

  例如:string.sub("abcd",2) ----> bcd

    string.sub("abcd",-2) ----> cd

    string.sub("abcd",2,-2) ----> bc

    string.sub("abcd",2,3) ----> bc

7. 在字符串中查找 string.find()

  • 原型:string.find (s, pattern [, init [, plain]])
  • 解释:函数在字符串s里查找第一个和参数pattern匹配的子串,如果找到了一个匹配的子串,就会返回这个子串的起始索引和结束索引,否则就会返回nil

     另外,参数init作为一个数字,指定了搜索的起始位置,这个数字默认为1可以一个负数,表示从后往前数的字符个数。

      参数plain作为第四个可选参数默认为flase,传入参数true表示关闭模式匹配,所以函数只做简单的查找子串的操作,

      如果子串pattern没有字符为空字符串""将会被认为是魔法字符。

      如果模式匹配子串被找到了,一个成功被找到的子串将会作为第三个返回值,放在两个索引返回值的后边而返回。

  • 如果 pattern 匹配模式是 带有 (...) 就是有括号这种,是捕获组形式,那find函数会返回匹配到的 字符串 。
  • 比如: a,b,str = string.find('qwe123', '(%a+)') ----> 1 3 qwe
  • 如果是完全的字符串查找,没有正则匹配,例如: string.sub("abcd",2) ----> bcd

    string.sub("abcd",-2) ----> cd

    string.sub("abcd",2,-2) ----> bc

    string.sub("abcd",2,3) ----> bc

8. 在字符串中查找并替换 string.gsub(mainString,pattern,replaceString,num)

  在字符串中替换。mainString 为要操作的字符串, pattern为被替换的字符,replaceString 要替换的字符,num 替换次数(可以忽略,则全部替换)

  例如:string.gsub("abcdabcd","a","z"); ----> zbcdzbcd 2

     string.gsub("aaaa","a","z",3); ----> zzza 3

9. 返回字符串的ASCII码 string.byte()

  例如:string.byte("ABCD",4) ----> 68

10. 将ASCII码变成 字符串 string.char()

  例如:string.char(97,98,99,100) ----> abcd

11. 分割字符串 string.split(要分割的字符串, 分隔符)

  例如:local result = string.split("1,2,3", ",") ----> result = {"1", "2", "3"}

12. 字符串反转 string.reverse(s)

  例如:string.reverse("jayden") ----> nedyaj

13. 字符串匹配 string.match (s, pattern)

  它不同于函数string.find()要返回匹配字符的索引,也不同于string.gmatch()函数会返回一个迭代函数可以取到所有的匹配项,

  这个函数它仅仅范回第一个匹配,简单易用,往往在一些实际应用中找到第一个匹配就够了,我们一起来看一下用法。

  • 原型:string.match(s, pattern [, init])
  • 解释:在字符串s中查找满足参数pattern的匹配子串,如果找到了一个匹配就返回这个匹配子串,若没找到则返回nil,如果参数pattern没有指定匹配参数,则返回整个匹配字符串,另外,一个数字形参数init用来指定查找字符串的其实位置,这个参数默认为1,当然也可以设置为负数,即-n表示从字符串尾部向前数n个字符开始查找。
  • pattern 可以 是 正则匹配 字符串,那 这个函数返回的就是 能匹配到的 字符串。
  • match_ret = string.match(ehre99wj=--=-*-/4mdqwl\0ds123fef, "%d%d%d") ---> 123

14. 字符串匹配迭代返回 string.gmatch (s, pattern)

匹配字符串s中的pattern , 返回一个迭代器函数, 每次调用该迭代器函数,返回下一个子串。

字符串拼接【字符串格式化】

%c - 接受一个数字, 并将其转化为ASCII码表中对应的字符
%d, %i - 接受一个数字并将其转化为有符号的整数格式
%o - 接受一个数字并将其转化为八进制数格式
%u - 接受一个数字并将其转化为无符号整数格式
%x - 接受一个数字并将其转化为十六进制数格式, 使用小写字母
%X - 接受一个数字并将其转化为十六进制数格式, 使用大写字母
%e - 接受一个数字并将其转化为科学记数法格式, 使用小写字母e
%E - 接受一个数字并将其转化为科学记数法格式, 使用大写字母E
%f - 接受一个数字并将其转化为浮点数格式
%g(%G) - 接受一个数字并将其转化为%e(%E, 对应%G)及%f中较短的一种格式
%q - 接受一个字符串并将其转化为可安全被Lua编译器读入的格式
%s - 接受一个字符串并按照给定的参数格式化该字符串
为进一步细化格式, 可以在%号后添加参数. 参数将以如下的顺序读入:

(1) 符号: 一个+号表示其后的数字转义符将让正数显示正号. 默认情况下只有负数显示符号.
(2) 占位符: 一个0, 在后面指定了字串宽度时占位用. 不填时的默认占位符是空格.
(3) 对齐标识: 在指定了字串宽度时, 默认为右对齐, 增加-号可以改为左对齐.
(4) 宽度数值
(5) 小数位数/字串裁切: 在宽度数值后增加的小数部分n, 若后接f(浮点数转义符, 如%.nf)则设定该浮点数的小数只保留n位, 若后接s(字符串转义符, 如%.ns)则设定该字符串只显示前n位.

  例如

string.format("%c", 83)                    -- 输出S
string.format("%+d", 17.0)               -- 输出+17
string.format("%05d", 17)                -- 输出00017
string.format("%o", 17)                    -- 输出21
string.format("%u", 3.14)                 -- 输出3
string.format("%x", 13)                    -- 输出d
string.format("%X", 13)                    -- 输出D
string.format("%e", 1000)                -- 输出1.000000e+03
string.format("%E", 1000)                -- 输出1.000000E+03
string.format("%6.3f", 13)                  -- 输出13.000
string.format("%q", "One\nTwo")         -- 输出"One\
                                                              --   Two"
string.format("%s", "monkey")              -- 输出monkey
string.format("%10s", "monkey")          -- 输出    monkey
string.format("%5.3s", "monkey")         -- 输出  mon

匹配用到的基本模式串 模式匹配函数 string.find, string.gmatch, string.gsub, string.match

.(点): 与任何字符配对
%a: 与任何字母配对
%c: 与任何控制符配对(例如\n)
%d: 与任何数字配对
%l: 与任何小写字母配对
%p: 与任何标点(punctuation)配对
%s: 与空白字符配对
%u: 与任何大写字母配对
%w: 与任何字母/数字配对
%x: 与任何十六进制数配对
%z: 与任何代表0的字符配对
[数个字符类]: 与任何[]中包含的字符类配对. 例如[%w_]与任何字母/数字, 或下划线符号(_)配对
[^数个字符类]: 与任何不包含在[]中的字符类配对. 例如[^%s]与任何非空白字符配对


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


转义字符%

  %转义字符string.find("abc%..","%%")4 4

  string.find("abc..d","%.%.")4 5

用"()"进行捕获

  ()捕获字符串string.find("12ab","(%a%a)")3 4 ab

  string.find("ab12","(%d%d)")3 4 12

模式修饰符

  +表示1个或多个,匹配最多个string.find("aaabbb","(a+b)") 1 4 aaab

  string.find("cccbbb","(a+b)") nil

  -表示0个或多个,匹配最少个string.find("zzxyyy","(xy-)") 3 3 x

  string.find("zzzyyy","(x-y)") 4 4 y

  *表示0个或多个,匹配最多个string.find("mmmnnn","(m*n)")1 4 mmmb

  string.find("lllnnn","(m*n)") 4 4 n

  ?表示0个或1个 string.find("aaabbb","(a?b)") 3 4 ab

  string.find("cccbbb","(a?b)") 4 4 b