【发布时间】:2017-03-01 17:27:25
【问题描述】:
lua string.find用find的反向方式找不到“/”,看下面代码:
c="~/abc.123" print(string.find(c,"/",-1,true))
这总是返回“nil”
【问题讨论】:
-
谁能帮忙解决这个问题?
lua string.find用find的反向方式找不到“/”,看下面代码:
c="~/abc.123" print(string.find(c,"/",-1,true))
这总是返回“nil”
【问题讨论】:
请参考 Lua 参考手册。 https://www.lua.org/manual/5.3/
string.find(c,"/",-1,true)
string.find 的第三个参数将决定从哪里开始搜索。
当您输入-1 时,您将从字符串的最后一个字符开始并向前搜索。当然你不会找到那样的东西。
对于字符串,正索引给出从开头开始的位置,负索引给出从字符串结尾开始的位置。
使用 1 从第一个字符开始。然后你会找到你的斜线。或者你可以使用任何东西
请注意,您也可以将 c:find("/",1,true) 写成更短的版本。
【讨论】:
要查找最后一次出现的/,请使用string.find(s,".*/")。第二个返回值是最后一个/的位置。
【讨论】:
Lua不能向左搜索,先考虑反转字符串:
function Find_Leftwards(s,m,i)
local b,f = s:reverse():find(m, i)
return #s-f, #s-b
end
【讨论】:
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'
另一种选择是将字符串简单地拆分为各个部分,然后获取最后一个部分。
【讨论】: