捕获单词 A 或 B 以及部分可选的额外参数

首先,它不匹配 ok 或 capture"ok".find("(ok|capture)") -- nil

其次,接下来匹配 ok,其后跟一个可选的 ok;args,但只捕获参数作为参数。 这是错误的:"ok;args".find("(ok)(;.+)?"),并且捕获组包含额外的 ;

function mymatch(str)
  local _, _, ok, oreveal = str:find("(ok)")
  return ok, oreveal
end

-- 这是我想要的
print(mymatch("ok")) -- ok nil
print(mymatch("cancel")) -- cancel nil
print(mymatch("ok;domatch")) -- ok domatch
print(mymatch("okdontmatch")) -- nil nil

原文链接 https://stackoverflow.com/questions/70458771

点赞
stackoverflow用户3832970
stackoverflow用户3832970

你可以使用

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

-- 这是我得到的结果
print(mymatch("ok")) -- ok nil
print(mymatch("cancel")) -- cancel nil
print(mymatch("ok;domatch")) -- ok domatch
print(mymatch("okdontmatch")) -- nil nil

请参见 在线 Lua 示例

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

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