【问题标题】:lua string.find can't match "/"lua string.find 不能匹配“/”
【发布时间】:2017-03-01 17:27:25
【问题描述】:

lua string.find用find的反向方式找不到“/”,看下面代码:

c="~/abc.123" print(string.find(c,"/",-1,true))

这总是返回“nil”

【问题讨论】:

  • 谁能帮忙解决这个问题?

标签: lua find


【解决方案1】:

请参考 Lua 参考手册。 https://www.lua.org/manual/5.3/

string.find(c,"/",-1,true)

string.find 的第三个参数将决定从哪里开始搜索。 当您输入-1 时,您将从字符串的最后一个字符开始并向前搜索。当然你不会找到那样的东西。

对于字符串,正索引给出从开头开始的位置,负索引给出从字符串结尾开始的位置。

使用 1 从第一个字符开始。然后你会找到你的斜线。或者你可以使用任何东西

请注意,您也可以将 c:find("/",1,true) 写成更短的版本。

【讨论】:

    【解决方案2】:

    要查找最后一次出现的/,请使用string.find(s,".*/")。第二个返回值是最后一个/的位置。

    【讨论】:

      【解决方案3】:

      Lua不能向左搜索,先考虑反转字符串:

      function Find_Leftwards(s,m,i)
          local b,f = s:reverse():find(m, i)
          return #s-f, #s-b
      end
      

      【讨论】:

        【解决方案4】:

        string.find 不能用于向左搜索字符串。 init 参数仅设置开始向右搜索的位置:

        第三个可选数字参数init 指定从何处开始搜索;它的默认值为 1,可以为负数。

        还有来自负指数手册的earlier note

        索引允许为负数,并被解释为从字符串末尾开始向后索引。因此,最后一个字符在位置 -1,依此类推。

        您需要滚动自己的函数,从右侧开始搜索索引:

        local function r_find (str, chr)
            local bchar = chr:byte(1)
        
            for i = #str, 1, -1 do
                if str:byte(i) == bchar then
                    return i
                end
            end
        end
        
        print(r_find('~/.config/foo/bar', '/')) --> 14
        

        或者考虑使用string.match查找最后一段:

        print(('~/.config/foo/bar'):match('/([^/]+)$')) --> 'bar'
        

        另一种选择是将字符串简单地拆分为各个部分,然后获取最后一个部分。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-08-08
          • 1970-01-01
          • 1970-01-01
          • 2014-08-04
          • 2016-02-13
          • 1970-01-01
          • 2012-02-23
          • 2021-11-02
          相关资源
          最近更新 更多