捕获单词 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 以及可选的额外参数的一部分的主要内容,如果未能解决你的问题,请参考以下文章

使用可选的位置参数定义 Julia 函数

Linux常用命令的英文单词缩写

Swift:如果变量 a 是非可选的,那么为啥变量 b 是可选的? [复制]

在正则表达式的可选部分中捕获的组

ES10(2019)可选的Catch Binding

Mathematica 中的可选命名参数