在Lua中,如何反转string.find()或string.gmatch()函数?
2017-5-23 12:23:57
收藏:0
阅读:137
评论:2
我有一个包含以下内容的字符串:
##### abc 'foo'
/path/to/filename:1
##### abc 'bar'
/path/to/filename:1
该字符串可能非常长(比如说 50 行),并且不经常更改。
我想获取单引号之间文本的最后一次出现(例如此示例中的 bar
)。这类似于其他人的 Python 问题(但那里的答案在我这里不能在 Lua 中工作,在下面看到)。
我可以解析每一行,并将结果放入数组中,然后只需取数组的最后一个元素,但我认为这不太优雅:
local text = [[
##### abc 'foo'
/path/to/filename:1
##### abc 'bar'
/path/to/filename:1
]]
local arr = {}
local pattern = "abc '([^']+)'"
for s in text:gmatch(pattern) do
table.insert(arr, s)
end
print('last:', arr[#arr])
我有兴趣使用 Lua 字符串模式从末尾搜索字符串。我尝试下面的模式,但是它从开头开始而不是从末尾开始:
local text = [[
##### abc 'foo'
/path/to/filename:1
##### abc 'bar'
/path/to/filename:1
]]
-- FIXME: pattern searches from beginning
local pattern = "abc '([^']+)'.*$"
local s = text:gmatch(pattern)()
assert(s == 'bar', 'expected "bar" but saw "'..s..'"')
print('last:', s)
这会产生:
input:12: expected "bar" but saw "foo"
哪种字符串模式指定了我要查找的“反向搜索”?
原文链接 https://stackoverflow.com/questions/9090173
点赞
stackoverflow用户7185318
另一个选项是使用 $
模式锚来将模式锚定在字符串的末尾。在这里你也不需要使用 gmatch
,只需要使用 match
就可以了(这样还可以省去调用 gmatch
返回的迭代器函数的需要)。总之,你可以得到:
text:match"'([^']+)'$"
2022-04-30 13:51:57
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?
你可以使用
local pattern = ".*abc '([^']+)'"
.*
是贪婪匹配,所以它会在匹配前尽可能多的匹配(在这种情况下,它会匹配所有较早的匹配并给出最后一个)。或者,如果你真的想做到,你可以颠倒你的字符串和(部分)你的模式,但我认为更好的方法是依靠贪婪的
.*
:Ppattern = "'([^']+)' cba" print(text:reverse():gmatch(pattern)()) -- rab print(text:reverse():gmatch(pattern)():reverse()) -- bar