string库提供了字符串处理的通用函数。 例如字符串查找、子串、模式匹配等。 当在 Lua 中对字符串做索引时,第一个字符从 1 开始计算(而不是 C 里的 0 )。 索引可以是负数,它指从字符串末尾反向解析。 即,最后一个字符在 -1 位置处,等等。
字符串库中的所有函数都在表string 中。 它还将其设置为字符串元表的__index 域。 因此,你可以以面向对象的形式使用字符串函数。 例如,string.byte(s,i) 可以写成 s:byte(i)。

字符串库假定采用单字节字符编码

string.byte(s[,i[,j]])

返回字符串s[i]. s[i+1],...,s[j]的内部数字编码。i的默认值是1,j的默认值是i

s = 'abc'
print(string.byte(s)) print(string.byte(s,2)) print(string.byte(s,2,3)) Output: 97 98 98 99


string.char(...)

接收零或更多的整数。 返回和参数数量相同长度的字符串。 其中每个字符的内部编码值等于对应的参数值。

print(string.char(98, 99, 100)) Output: bcd


string.dump(function)

返回包含有以二进制方式表示的(一个 二进制代码块 )指定函数的字符串。 之后可以用 loadstring 调用这个字符串获得 该函数的副本。

function必须是没有upvalues的lua函数。

function dump() print("dump test ") end s = string.dump(dump) print(s) func = loadstring(s) func() Output: LuaQ dump test 

lua 5.3 有改动


string.find(s, pattern [,init [, plain]])

查找第一个字符串 s 中匹配到的 pattern 如果找到一个匹配,find 会返回 s 中关于它起始及终点位置的索引; 否则,返回 nil。 第三个可选数字参数 init 指明从哪里开始搜索; 默认值为 1 ,同时可以是负值。 第四个可选参数 plain 为 true 时, 关闭模式匹配机制。 此时函数仅做直接的 “查找子串”的操作, 而 pattern 中没有字符被看作魔法字符。 注意,如果给定了 plain ,就必须写上 init。

如果在模式中定义了捕获,捕获到的若干值也会在两个索引之后返回。

local s = "abcdefg" print(string.find(s,"(c)")) print(string.find(s,"(c)"),1, true) Output: 3 3 c 3 1 true


string.format(formatstring, ...)

返回不定数量参数的格式化版本, 格式化串为第一个参数(必须是一个字符串)。 格式化字符串遵循 ISO C 函数 sprintf 的规则。 不同点在于选项 *, h, L, l, n, p 不支持, 另外还增加了一个选项 q。 q 选项将一个字符串格式化为两个双引号括起,对内部字符做恰当的转义处理的字符串。 该字符串可以安全的被 Lua 解释器读回来。 例如,调用

string.format('%q', 'a string with "quotes" and \n new line')

会产生字符串:

"a string with \"quotes\" and \new line"

E, e, f, G, and g 都期待一个对应的数字参数。 选项 c, d, i, o, u, X, and x 则期待一个整数。 选项 q 期待一个字符串; 选项 s 期待一个没有内嵌零的字符串。

print(string.format("%d, %s", 1, "a")) Output: 1, a

string.gmatch(s, pattern)

返回一个迭代器函数。 每次调用这个函数都会继续以 pattern 对 s 做匹配,并返回所有捕获到的值。 如果 pattern 中没有指定捕获,则每次捕获整个 pattern。

对这个函数来说,模板前开始的 '^' 不会当成锚点。因为这样会阻止迭代。

s = "hello world from Lua"
for w in string.gmatch(s, "%a+") do print(w) end Output: hello world from Lua

string.gsub(s, pattern, repl [, n])

将字符串 s 中,所有的(或是在 n 给出时的前 n 个) pattern 都替换成 repl ,并返回其副本。 repl 可以是字符串、表、或函数。 gsub 还会在第二个返回值返回一共发生了多少次匹配。 gsub 这个名字来源于 Global SUBstitution 。

如果 repl 是一个字符串,那么把这个字符串作为替换品。 字符 % 是一个转义符: repl 中的所有形式为 %d 的串表示 第 d 个捕获到的子串,d 可以是 1 到 9 。 串 %0 表示整个匹配。 串 %% 表示单个 %。

如果 repl 是张表,每次匹配时都会用第一个捕获物作为键去查这张表。

如果 repl 是个函数,则在每次匹配发生时都会调用这个函数。 所有捕获到的子串依次作为参数传入。

任何情况下,模板中没有设定捕获都看成是捕获整个模板。

如果表的查询结果或函数的返回结果是一个字符串或是个数字, 都将其作为替换用串; 而在返回 false 或 nil 时不作替换 (即保留匹配前的原始串)。

-- 匹配字符转
-- 先匹配hello, %1 为匹配值,  将hello 替换为hello hello
-- 匹配world时 同理
print(string.gsub("hello world", "(%w+)", "%1 %1")) print(string.gsub("hello world", "(%w+)", "%0 %0",1)) Output: hello hello world world 2 hello hello world 1 -- 替换函数 print(string.gsub("4+5 = $return 4+5$", "%$(.-)%$", function (s) print(s) return loadstring(s)() end)) Output: return 4+5 4+5 = 9 1 --表 local t = {name="lua", version="5.3"} print(string.gsub("$name-$version.tar.gz", "%$(%w+)", t)) Output: lua-5.3.tar.gz 2

string.len(s)

接收一个字符串,返回其长度。 空串 "" 的长度为 0 。 内嵌零也统计在内,因此 "a\000bc\000" 的长度为 5 。

print(string.len("hello world \0")) Output: 13

string.lower(s)

接收一个字符串,将其中的大写字符都转为小写后返回其副本。 其它的字符串不会更改。 对大写字符的定义取决于当前的区域设置。

print(string.lower("HeLLo World"))Output:
hello world

tring.match(s, pattern [, init])

在字符串 s 中找到第一个能用 pattern匹配到的部分。 如果能找到,match 返回其中的捕获物; 否则返回 nil 。 如果 pattern 中未指定捕获, 返回整个 pattern 捕获到的串。 第三个可选数字参数 init 指明从哪里开始搜索; 它默认为 1 且可以是负数。

print(string.match("hello world", "(%w+)")) print(string.match("hello world", "(%w+)", -1)) Output: hello d

string.rep(s, n)

返回n个字符串s连在一起的字符串

print(string.rep("abc", 2)) Output: abcabc

lua 5.3 有改动


string.reverse(s)

返回字符串 s 的翻转串。

print(string.reverse("abc"))Output: cba

string.sub(s)

返回 s 的子串, 该子串从 i 开始到 j 为止; i 和 j 都可以为负数。 如果不给出 j ,就当它是 -1 (和字符串长度相同)。 特别是, 调用 string.sub(s,1,j) 可以返回 s 的长度为 j 的前缀串, 而 string.sub(s, -i) 返回长度为 i的后缀串。

print(string.sub("Hello World", 5)) print(string.sub("Hello World", -3)) Output: o World rld

string.upper(s)

接收一个字符串,将其中的小写字符都转为大写后返回其副本。 其它的字符串不会更改。 对小写字符的定义取决于当前的区域设置。

print(string.upper("Hello World"))Output:
HELLO WORLD

匹配模式

字符类:

字符类 用于表示一个字符集合。 下列组合可用于字符类:

  • x(这里 x 不能是 魔法字符 ^$()%.[]*+-? 中的一员) 表示字符 x 自身。
  • .: (一个点)可表示任何字符。
  • %a: 表示任何字母。
  • %c: 表示任何控制字符。
  • %d: 表示任何数字。
  • %g: 表示任何除空白符外的可打印字符。
  • %l: 表示所有小写字母。
  • %p: 表示所有标点符号。
  • %s: 表示所有空白字符。
  • %u: 表示所有大写字母。
  • %w: 表示所有字母及数字。
  • %x: 表示所有 16 进制数字符号。
  • %x(这里的 x 是任意非字母或数字的字符) 表示字符 x。 这是对魔法字符转义的标准方法。 所有非字母或数字的字符 (包括所有标点,也包括非魔法字符) 都可以用前置一个 '%' 放在模式串中表示自身。
  • [set]: 表示 set 中所有字符的联合。 可以以 '-' 连接,升序书写范围两端的字符来表示一个范围的字符集。 上面提到的 %x形式也可以在 set 中使用 表示其中的一个元素。 其它出现在 set 中的字符则代表它们自己。 例如,[%w_] (或 [_%w]) 表示所有的字母数字加下划线), [0-7] 表示 8 进制数字, [0-7%l%-] 表示 8 进制数字加小写字母与 '-' 字符。

    交叉使用类和范围的行为未定义。 因此,像 [%a-z] 或 [a-%%] 这样的模式串没有意义。

  • [^set]: 表示 set 的补集, 其中 set 如上面的解释。

所有单个字母表示的类别(%a,%c,等), 若将其字母改为大写,均表示对应的补集。 例如,%S 表示所有非空格的字符。

如何定义字母、空格、或是其他字符组取决于当前的区域设置。 特别注意:[a-z] 未必等价于 %l 。

模式条目:

模式条目 可以是

  • 单个字符类匹配该类别中任意单个字符;
  • 单个字符类跟一个 '*', 将匹配零或多个该类的字符。 这个条目总是匹配尽可能长的串
  • 单个字符类跟一个 '+', 将匹配一或更多个该类的字符。 这个条目总是匹配尽可能长的串
  • 单个字符类跟一个 '-', 将匹配零或更多个该类的字符。 和 '*' 不同, 这个条目总是匹配尽可能短的串
  • 单个字符类跟一个 '?', 将匹配零或一个该类的字符。 只要有可能,它会匹配一个;
  • %n, 这里的 n 可以从 1 到 9; 这个条目匹配一个等于 n 号捕获物(后面有描述)的子串。
  • %b_xy_, 这里的 x 和 y 是两个明确的字符; 这个条目匹配以 x 开始 y 结束, 且其中 x 和 y 保持 平衡 的字符串。 意思是,如果从左到右读这个字符串,对每次读到一个 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 。

参考链接:http://cloudwu.github.io/lua53doc/manual.html

转载于:https://www.cnblogs.com/DeeLMind/p/7110943.html

Lua string库整理相关推荐

  1. lua string库

    --lua中字符串索引从前往后是1,2,--,从后往前是-1,-2--. --string库中所有的function都不会直接操作字符串,只返回一个结果. ---------------------- ...

  2. lua string 库

    转载自:http://blog.sina.com.cn/s/blog_6d9d6d160101975u.html --lua中字符串索引从前往后是1,2,--,从后往前是-1,-2--. --stri ...

  3. Lua 之string库

    标准string库 基础字符串函数 string.len(s) 返回一个字符串的长度,例如 print(string.len("hello world")) -- 11 strin ...

  4. Lua语法小贴士(二)string库

    string库 byte方法,返回byte值: print(string.byte("abc")) --97 print(string.byte("abc", ...

  5. 第五章 常用Lua开发库2-JSON库、编码转换、字符串处理

    JSON库 在进行数据传输时JSON格式目前应用广泛,因此从Lua对象与JSON字符串之间相互转换是一个非常常见的功能:目前Lua也有几个JSON库,本人用过cjson.dkjson.其中cjson的 ...

  6. LeetCode题库整理【Java】—— 3 无重复字符的最长子串

    LeetCode题库整理[Java] ## 3 无重复字符的最长子串 题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" ...

  7. LeetCode题库整理【Java】—— 2 两数相加

    LeetCode题库整理[Java] 2.两数相加 题目:给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果, ...

  8. LeetCode题库整理【Java】—— 7整数反转

    LeetCode题库整理[Java] 7.整数反转 题目:给出一个32位的有符号整数,你需要将这个这个整数中每位上的数字进行反转. 示例1: 输入: 123 输出: 321 示例2: 输入: -123 ...

  9. LeetCode题库整理【Java】—— 1两数之和

    LeetCode题库整理[Java] 1.两数之和 题目:给定一个整数数组和一个目标值,找出数组中和为目标值的两个数.你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nu ...

最新文章

  1. android 6.0 获取手机号,头条小程序获取手机号码,回调未执行,导致无法获取手机号码...
  2. signature=c4f11bb5142d9f6ce0876b3cc0d888af,PROVISIONAL SIGNATURE SCHEMES
  3. [转]用DateTime.ToString(string format)输出不同格式
  4. C++ 中 const和define的区别
  5. chap单向认证客户端
  6. IP通信基础 4月15日
  7. php单线程的缺点,PHP在设计上有哪些缺陷?
  8. 如何修改wampserver中mysql中字符编码的解决方案
  9. 无需私钥的pssh的安装使用
  10. C 标准库 —— scanf(fflush(stdin))
  11. VMware for mac inside error solutions
  12. MAC上mmap()的参数问题
  13. 《番茄工作法图解》一次只做一件事
  14. 电源大师课笔记 2.7
  15. 基于ASP.NET技术 学生留言板的设计与实现
  16. dubbo源码解析-router
  17. 推荐几个很实用的编程网站
  18. 使用Math.max和Math.min求数组的最大值和最小值
  19. vim实用指南(9)vimdiff好用的可视化文本对比工具
  20. k8s+docker实战(长篇)

热门文章

  1. VMware中linux与window目录共享
  2. POJ 1160 Post Office
  3. java出现no XXX in java.library.path的解决办法及eclipse配置
  4. linux系统无法启动提示give root password for maintenance的解决方法
  5. GridView导出Excel研究
  6. Excel 自动根据Sheet名生成目录
  7. android开发学习 ------- 弹出框
  8. Linux 链接详解----动态链接库
  9. linux断电关机后,进度条满后卡在那里
  10. XenDesktop7-基于SCVMM2012SP1的部署