Найти начальную и конечную позиции совпадения в строке - PullRequest
0 голосов
/ 17 сентября 2018

Я пытался найти простое решение для следующей проблемы в lua: Учитывая строку, такую ​​как str, получить начальную и конечную позицию последнего встречающегося A-mer (один или несколько экземпляров A).Например, для строки str = "123A56AA9" решение - start=7, finish=8.

Чтобы получить конечную позицию, я могу использовать: _,finish = str:find(".*A")` -- returns 8

, но я не могу найти никакого решения, чтобы получить начальную позицию.Это возможно?Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Есть много способов решить проблему.Мне нравится работать с Gmatch.Btw.Вы использовали end в качестве имени переменной.Но это зарезервированное ключевое слово.

str = "123A56AA9"
for startpos, match, endpos in str:gmatch('()(A+)()[^A]*$') do
    print(startpos, match, endpos-1)
end
0 голосов
/ 17 сентября 2018

string.find возвращает начальную и конечную позиции матча.Итак, стартовый индекс - это та переменная _, которую вы проигнорировали.

Ваша проблема в том, что ваш шаблон на самом деле не соответствует тому, что вы ищете.Если вы хотите последнюю последовательность символов «А», вам нужно сделать что-то еще.Например:

local start, final = 1, 1

while(final)
  local temp_start, temp_final = str:find("A+", end)
  if(temp_start) then
    start, final = temp_start, temp_final
  else
    final = nil
  end
end

Более умный, основанный на шаблонах метод будет выглядеть так:

local start, final, match = str:find("(A+)[^A]*$")
if(start) then
  final = start + (#match - 1)
end
...