捕获单词 a 或 b 以及可选的额外参数的一部分
capture word a or b and part of optional extra arguments
首先这不匹配 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
您可以使用
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
^(ok%f[%A]);?(.*)$
模式匹配
^
- 字符串开头
(ok%f[%A])
- 第 1 组:ok
和尾随的“单词边界”(%f[%A]
是边界模式,确保下一个字符(如果存在)必须是非字母)
;?
- 一个可选的 ;
(.*)
- 第 2 组:字符串的其余部分
$
- 字符串结尾。
首先这不匹配 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
您可以使用
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
^(ok%f[%A]);?(.*)$
模式匹配
^
- 字符串开头(ok%f[%A])
- 第 1 组:ok
和尾随的“单词边界”(%f[%A]
是边界模式,确保下一个字符(如果存在)必须是非字母);?
- 一个可选的;
(.*)
- 第 2 组:字符串的其余部分$
- 字符串结尾。