十四、Lua字符串库中的几个重要函数

来源:互联网 发布:linux运维工程师薪资 编辑:程序博客网 时间:2024/06/05 14:59

Lua字符串库中的几个重要函数|果冻想

本文是对于“果冻想”的《Lua入门系列》所作笔记,原文来自上面链接。

find

string.find()函数用于在一个给定的目标字符串中搜索一个模式。
  1. local str = "Hello World"
  2. local i, j = string.find(str, "Hello")-- 返回Hellostr中的起始位置和终止位置
  3. print(i, j)-- 1 5
  4. local k, v = string.find(str, "haha") -- 没有找到匹配,返回nil
  5. print(k, v)-- nil nil
第二个参数可以传递一个正则表达式,也就是一个pattern,进行正则匹配。
  1. local str = "Hello123456World"
  2. local i, j = string.find(str, "%d+")
  3. print(i, j)-- 6 11

match

string.match与string.find相似,但是string.match返回的是所匹配的字符串。
  1. local str = "Hello12345World"
  2. local subStr = string.match(str, "%d+")
  3. print(subStr)
  4. local i, j =string.find(str, "%d+")
  5. subStr =string.sub(str, i, j)
  6. print(subStr)
  7. -- 是不是可以认为match等于find + sub呢?

gsub

string.gsub有三个参数:目标字符串、模式和替换字符串。
  1. local str = "Hello World"
  2. local strResult = string.gsub(str, "Hello", "Jelly")
  3. print(strResult) -- Jelly World
string.gsub有可选的第四个参数,可以限制替换的次数。
  1. local str = "Hello World"
  2. -- 这里不限制替换次数
  3. local strResult, cnt = string.gsub(str, "l", "o")
  4. print(strResult) -- Heooo Worod
  5. print(cnt) -- 实际替换的次数
  6. -- 开始限制替换次数
  7. strResult, cnt = string.gsub(str, "l", "o", 1)
  8. print(strResult) -- Heolo World
  9. print(cnt) -- 就替换了一次

更强大的地方是,它的第三个参数可以是table或函数:
参数是table
  1. local replaceTb = {hello = "Jelly", world = "Think"}
  2. local str = "hello world"
  3. -- 注意,第3个参数是一个table
  4. local strResult = string.gsub(str, "hello", replaceTb)
  5. print(strResult) -- Jelly world
  6. strResult = string.gsub(strResult, "world", replaceTb)
  7. print(strResult) -- Jelly Think
  8. strResult = string.gsub(strResult, "hello", replaceTb)
  9. print(strResult) -- Jelly Think
参数是function
  1. local replaceFunc = function (str)
  2. return str .. "JellyThink"
  3. end
  4. local str = "hello world"
  5. -- 注意,第3个参数是一个Func
  6. local strResult = string.gsub(str, "hello", replaceFunc)
  7. print(strResult) -- helloJellyThink world

gmatch

gmatch会返回一个迭代器函数,你可以使用这个迭代器函数区迭代匹配的所有内容。
  1. local str = "Hello World"
  2. local iteratorFunc = string.gmatch(str, "%a+") -- %a+表示匹配所有单词
  3. for i in iteratorFunc do
  4. print(i)
  5. end
自己实现一个gmatch:
  1. local str = "Hello World"
  2. -- 使用find来实现一个自己的gmatch
  3. local myGmatch = function (s, pattern)
  4. local resultTb = {} -- 相当于迭代器中的恒定状态
  5. local index = 0 -- 相当于迭代器中的控制变量
  6. local i, j = string.find(s, pattern)
  7. while i do
  8. resultTb[#resultTb + 1] = string.sub(s, i, j)
  9. i, j = string.find(s, pattern, j + 1)
  10. end
  11. return function () -- 返回一个迭代器函数
  12. index = index + 1
  13. return resultTb[index]
  14. end
  15. end
  16. for i in myGmatch(str, "%a+") do
  17. print(i)
  18. end
0 0
原创粉丝点击