捕获单词 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

参见online Lua demo

^(ok%f[%A]);?(.*)$ 模式匹配

  • ^ - 字符串开头
  • (ok%f[%A]) - 第 1 组:ok 和尾随的“单词边界”(%f[%A] 是边界模式,确保下一个字符(如果存在)必须是非字母)
  • ;? - 一个可选的 ;
  • (.*) - 第 2 组:字符串的其余部分
  • $ - 字符串结尾。