查找一个字符串中所有子串的位置

请问在 Lua 中有什么方法可以查找(并循环)一个字符串中所有子串的位置?例如,如果我有以下字符串:

"honewaidoneaeifjoneaowieone"

我想要遍历这个字符串中所有出现的"one"的位置(即索引),我知道它出现了四次,但我不知道如何找到它们。我知道 string.find() 函数可以找到第一次出现的子串,但这并没有什么卵用。

点赞
用户4984564
用户4984564
local str = "honewaidoneaeifjoneaowieone"

-- 这个循环只会给你子字符串;它不会告诉你它在哪里开始或结束
for substring in str:gmatch 'one' do
   print(substring)
end

-- 这个循环告诉你子字符串的开始和结束位置。你可以在 string.find 中使用这些值来获取匹配的字符串。
local first, last = 0
while true do
   first, last = str:find("one", first+1)
   if not first then break end
   print(str:sub(first, last), first, last)
end

-- 和上面相同,但作为一个递归函数,它接受一个回调并在结果上调用它,以便更轻松地重用它
local function find(str, substr, callback, init)
   init = init or 1
   local first, last = str:find(substr, init)
   if first then
       callback(str, first, last)
       return find(str, substr, callback, last+1)
   end
end

find(str, 'one', print)
2020-02-17 08:24:29
用户107090
用户107090

你可以告诉 string.find 在哪里开始搜索:

s="honewaidoneaeifjoneaowieone"
p="one"
b=1
while true do
    local x,y=string.find(s,p,b,true)
    if x==nil then break end
    print(x)
    b=y+1
end

这段代码会在每次搜索时从上次匹配的结尾开始,即只会找到字符串的非重叠出现。如果你想找到字符串的重叠出现,可以使用 b=x+1

2020-02-17 13:52:33