Lua 中的正则表达式问题
2018-8-16 5:44:47
收藏:0
阅读:97
评论:3
我有一个URL字符串,需要从匹配中获取某些单词。
例如:
/school/student/studentname1/detail/55/address/address1
我可以像这样传递以获取所需信息的详细信息:
local s1,s2,s3 =myString:match("/school/student/(.-)/detail/(.-)/address/(.-)")
现在问题是,我的字符串可能是
myString = /school/student/studentname1
或
myString = /school/student/studentname1/detail/55
在这种情况下,我的正则表达式会失败,需要帮助?
点赞
用户7500028
首先,您的原始模式未按预期工作,因为它未捕获地址(因为您使用了 .- 这不是贪心的)
因此,修复原始模式的一种方法可以是使用 /school/student/([^/]+)/detail/([^/]+)/address/([^/]+)
其中 [^/] 表示除 / 之外的任何字符
然后,为了选择地匹配一些选项,并且由于 Lua 模式不允许可选组,您可能需要像这样使用多个步骤:
myString = "/school/student/studentname1/detail/55"
local s1,s2,s3
s1 =myString:match("/school/student/([^/]+)")
if (s1 ~= nil) then
print(s1)
s2 =myString:match("/detail/([^/]+)")
if (s2 ~= nil) then
print(s2)
s3 =myString:match("/address/([^/]+)")
if (s3 ~= nil) then
print(s3)
end
end
end
最后,如果您想确保详细信息和地址按照给定的顺序出现,则可以使用此方法:
myString = "/school/student/studentname1/address/myaddress"
local s1,s2,s3
s1 =myString:match("/school/student/([^/]+)")
if (s1 ~= nil) then
print(s1)
s1,s2 =myString:match("/school/student/([^/]+)/detail/([^/]+)")
if (s2 ~= nil) then
print(s2)
s1,s2,s3 =myString:match("/school/student/([^/]+)/detail/([^/]+)/address/([^/]+)")
if (s3 ~= nil) then
print(s3)
end
end
end
这样,它将找到 /school/student/studentname1/detail/55,但不会找到 /school/student/studentname1/address/myaddress。如果您不需要像这样使用它,则仅使用第一版。
2018-08-16 07:21:28
用户6834680
local all_fields = { student = 1, detail = 2, address = 3 }
local function parse(str)
local info = {}
local index
for w in str:gmatch"/([^/]+)" do
if index then
info[index] = w
index = nil
else
index = all_fields[w]
end
end
return (table.unpack or unpack)(info, 1, 3)
end
local myString = '/school/student/studentname1/detail/55/address/address1'
local s1, s2, s3 = parse(myString)
print(s1, s2, s3)
myString = '/school/student/studentname1/address/address1'
s1, s2, s3 = parse(myString)
print(s1, s2, s3)
myString = '/school/student/studentname1/detail/55'
s1, s2, s3 = parse(myString)
print(s1, s2, s3)
local all_fields = { student = 1, detail = 2, address = 3 } -- 定义包含所有字段索引的表
local function parse(str) -- 定义解析函数,参数为字符串
local info = {} -- 定义空表 info
local index -- 定义变量 index
for w in str:gmatch"/([^/]+)" do -- 遍历字符串中所有的 "/" 前缀
if index then -- 如果 index 不为空
info[index] = w -- 将表 info 中索引为 index 的元素赋值为 w
index = nil -- index 设为空
else -- 如果 index 为空,即 w 是一个字段名
index = all_fields[w] -- 将 index 设为对应的索引值
end
end
return (table.unpack or unpack)(info, 1, 3) -- 返回 info 表中索引为 1、2、3 的前三个元素
end
-- 定义要解析的字符串
local myString = '/school/student/studentname1/detail/55/address/address1'
-- 调用解析函数并将结果赋值给三个变量
local s1, s2, s3 = parse(myString)
-- 打印解析结果
print(s1, s2, s3)
myString = '/school/student/studentname1/address/address1'
s1, s2, s3 = parse(myString)
print(s1, s2, s3)
myString = '/school/student/studentname1/detail/55'
s1, s2, s3 = parse(myString)
print(s1, s2, s3)
2018-08-16 08:01:55
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在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 代码?

这是我能想到的最好的单行代码:
local s1,s2,s3 =myString:match("/[^/]+/[^/]+/([^/]+)/?[^/]*/?([^/]*)/?[^/]*/?([^/]*)")演示
解释:
我使用负字符类以通用的方式获取斜杠之间的文本。这使得以
*作为类和/作为斜杠更容易标识后面的部分为可选项(您可以将初始部分 less generic 并且只使用/school/student/)。这在 (PC)RE 中很容易,但是 Lua Patterns 不支持可选捕获组以及替换。 相反,您可以使用 rex_pcre 库 中的 PCRE 模式来使用 Lua 或使用模式匹配的库 Lpeg。