捕获单词 a 或 b 以及可选的额外参数的一部分
Posted
技术标签:
【中文标题】捕获单词 a 或 b 以及可选的额外参数的一部分【英文标题】:capture word a or b and part of optional extra arguments 【发布时间】:2022-01-24 06:02:20 【问题描述】:首先这不匹配ok or capture
"ok".find("(ok|capture)") -- nil
其次,ok
匹配一个可选的ok;args
但只捕获args
作为参数。这是错误的"ok;args".find("(ok)(;.+)?")
,捕获组包含额外的;
。
function mymatch(str)
local _, _, ok, oreveal = str:find("(ok)")
return ok, oreveal
end
-- this is what I want
print(mymatch("ok")) -- ok nil
print(mymatch("cancel")) -- cancel nil
print(mymatch("ok;domatch")) -- ok domatch
print(mymatch("okdontmatch")) -- nil nil
【问题讨论】:
ok(?:;(.+))?
?
Lua 模式不是正则表达式,例如缺少交替运算符证明了这一点。所以你不能在 Lua 模式中的模式本身中使用 match this or that 逻辑。
不,如果没有惯用的解决方案,我可以删除 cancel
并匹配 ok
,但可选参数会很好。
"ok".find("(ok|capture)")
和 "ok;args".find("(ok)(;.+)?")
是无效的语法。 string.find 也不会返回 4 个值,只有一次捕获,因此在 local _, _, ok, oreveal = str:find("(ok)")
oreveal
将始终为 nil
。
【参考方案1】:
你可以使用
function mymatch(str)
local _, _, ok, oreveal = str:find("^(ok%f[%A]);?(.*)$")
if ok == nil then
_, _, ok, oreveal = str:find("^(cancel%f[%A]);?(.*)$")
end
if oreveal == "" then
oreveal = nil
end
return ok, oreveal
end
-- this is what I get
print(mymatch("ok")) -- ok nil
print(mymatch("cancel")) -- cancel nil
print(mymatch("ok;domatch")) -- ok domatch
print(mymatch("okdontmatch")) -- nil nil
请参阅online Lua demo。
^(ok%f[%A]);?(.*)$
模式匹配
^
- 字符串开头
(ok%f[%A])
- 第 1 组:ok
和尾随的“单词边界”(%f[%A]
是一种边界模式,确保下一个字符(如果存在)必须是非字母)
;?
- 一个可选的;
(.*)
- 第 2 组:字符串的其余部分
$
- 字符串结束。
【讨论】:
以上是关于捕获单词 a 或 b 以及可选的额外参数的一部分的主要内容,如果未能解决你的问题,请参考以下文章