String lua sting.match只需要第一次检测

String lua sting.match只需要第一次检测,string,lua,pattern-matching,String,Lua,Pattern Matching,我正在处理bluray文件夹,以使用io.open检测BDMV文件夹 当使用for循环查找NAS位置中的文件夹时,我使用sting.find获取文件夹列表中提到的“BDMV”。我将此值存储在一个表中 问题是,当我运行代码时,它将列出所有子目录,并将其添加到表中 我只需要文件夹的第一个实例,如 1=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV 我得到的是 所有子文件夹和文件的列表 1=Minions.2015.1080p.Bl

我正在处理bluray文件夹,以使用io.open检测BDMV文件夹

当使用for循环查找NAS位置中的文件夹时,我使用sting.find获取文件夹列表中提到的“BDMV”。我将此值存储在一个表中

问题是,当我运行代码时,它将列出所有子目录,并将其添加到表中

我只需要文件夹的第一个实例,如

1=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV
我得到的是

所有子文件夹和文件的列表

1=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV
2=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV/AUXDATA
3=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-    RARBG/BDMV/AUXDATA/sound.bdmv
4=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV/BACKUP
5=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV/BACKUP/BDJO
6=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-    RARBG/BDMV/BACKUP/BDJO/00000.bdjo
7=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV/BACKUP/BDJO/00001.bdjo
8=Minions.2015.1080p.BluRay.AVC.TrueHD.7.1.Atmos-RARBG/BDMV/BACKUP/BDJO/00002.bdjo
等等

这是大约1000多个我不想要的文件条目

我尝试了sting.match来匹配一个模式,只检测第一个实例,而忽略其余的。到目前为止没有运气

if string.find(t,"BDMV") then
    if string.match(t,"(.+/BDMV)") then

    Movies[#Movies+1] = t
else
   print("ignor")
end

如果您需要更多详细信息,请告诉我。谢谢。

如果string.find(t,“BDMV$”),则
可能会执行此任务。
^.+
在这种情况下没有区别,因此可以删除。另外,您可能希望在
BDMV
之后使用frontier模式,否则它也将在
/BDMVsomethingelse
上匹配。或者只需检查
/BDMV$
并跳过
已有的
缓存。@PaulKulchenko-
^.+
无法删除,因为
BDMV
之前的前缀是检测重复项所必需的。主要的想法是去掉后缀。@PaulKulchenko-关于
/BDMV$
的想法已经由@Jakuje提出。@ppperry-我对上下文一无所知。只有OP能回答这个问题。“关于
/BDMV$
的想法已经由@Jakuje提出了。”——是的,但是没有斜杠,它并不总是能达到预期效果。
local already_have = {}
local Movies = {}

-- Start of your loop
   -- local t = ...
   local name = string.match(t, "^.+/BDMV%f[%W]")  -- Thanks to Paul for advice
   if name and not already_have[name] then
      already_have[name] = true
      Movies[#Movies+1] = t
   end
-- end of loop