Поиск всех экземпляров строки в строке - PullRequest
1 голос
/ 16 февраля 2020

Каким образом я могу найти (и через l oop) все экземпляры строки в другой строке в lua? Например, если у меня есть строка

"honewaidoneaeifjoneaowieone"

И я хочу, чтобы l oop через все экземпляры (и под этим я имею в виду индексы) «один» в этой строке, ну, я могу видеть что это появляется четыре раза, но я понятия не имею, как на самом деле их найти. Я знаю, что string.find () может найти первый экземпляр, но это не очень мне помогает.

Ответы [ 2 ]

1 голос
/ 17 февраля 2020

Вы можете указать 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.

1 голос
/ 17 февраля 2020
local str = "honewaidoneaeifjoneaowieone"

-- This one only gives you the substring;
-- it doesn't tell you where it starts or ends
for substring in str:gmatch 'one' do
   print(substring)
end

-- This loop tells you where the substrings
-- start and end. You can use these values in
-- string.find to get the matched string.
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

-- Same as above, but as a recursive function
-- that takes a callback and calls it on the
-- result so it can be reused more easily
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...