2017-01-06 11 views
2

Я пытаюсь найти разницу в тексте между двумя строковыми значениями в Lua, и я просто не совсем уверен, как это сделать эффективно. Я не очень опытен в работе с строковыми шаблонами, и я уверен, что это мое падение на этом. Вот пример:Поиск «разницы» между двумя строковыми текстами (пример Lua)

-- Original text 
local text1 = "hello there" 
-- Changed text 
local text2 = "hello.there" 

-- Finding the alteration of original text with some "pattern" 
print(text2:match("pattern")) 

В приведенном выше примере, я бы хотел, чтобы выводить текст, так что разница между этими двумя текстами «». То же самое касается случаев, когда разница может быть чувствительна к струнной модели, как это:

local text1 = "hello there" 
local text2 = "hello()there" 

print(text2:match("pattern")) 

В этом примере я хотел бы напечатать «(» так как в этот момент новая строка больше не согласуется с старый.

Если у кого есть какие-либо понять по этому поводу, я действительно ценю это. к сожалению, я не мог дать больше работать с кодовым мудр, я просто не знаю, с чего начать.

+0

что должно быть разница для «привет» и «привет htere» – Steve

+0

В идеале, просто «ч» в «htere». Я просто пытаюсь найти именно то, где в измененном тексте, что это уже не согласовано, и просто отключить его в этот момент и вернуть разницу. Этот второй пример немного вводил в заблуждение, я на самом деле хотел сказать, что он должен возвращать "(", вместо "()". Я исправлю это. – user7385467

+0

, тогда вы сможете сделать цикл for для итерации по всем символы в строке один и сравните с строкой 2. Когда вы найдете несоответствие, тогда остановите – Steve

ответ

0
local function get_inserted_text(old, new) 
    local prv = {} 
    for o = 0, #old do 
     prv[o] = "" 
    end 
    for n = 1, #new do 
     local nxt = {[0] = new:sub(1, n)} 
     local nn = new:sub(n, n) 
     for o = 1, #old do 
     local result 
     if nn == old:sub(o, o) then 
      result = prv[o-1] 
     else 
      result = prv[o]..nn 
      if #nxt[o-1] <= #result then 
       result = nxt[o-1] 
      end 
     end 
     nxt[o] = result 
     end 
     prv = nxt 
    end 
    return prv[#old] 
end 

Использование:

print(get_inserted_text("hello there", "hello.there")) --> . 
print(get_inserted_text("hello there", "hello()there")) --> () 
print(get_inserted_text("hello there", "hello htere")) --> h 
print(get_inserted_text("hello there", "heLlloU theAre")) --> LUA 
2

Просто перебирайте струны и найдите, когда они не совпадают.

function StringDifference(str1,str2) 
    for i = 1,#str1 do --Loop over strings 
     if str1:sub(i,i) ~= str2:sub(i,i) then --If that character is not equal to it's counterpart 
      return i --Return that index 
     end 
    end 
    return #str1+1 --Return the index after where the shorter one ends as fallback. 
end 

print(StringDifference("hello there", "hello.there")) 
+0

Спасибо, но я не ищу самую длинную длину текста. Я искал * разницу * между ними. То есть разница между «привет» и «привет» была бы «.» – user7385467

+0

@ user7385467 Однако, имея index, вы можете сделать 's: sub (i, i)', чтобы получить символ в этом индексе. Поскольку задействованы две строки, какой символ вы хотите, первая строка или вторая? Это тривиально, чтобы изменить эту функцию, чтобы дать вам результат, который вам нужен. – tonypdmtr

+0

@ user7385567 Я не возвращая длинный текст, я возвращаю индекс, в котором строки разные. Например, если я вернусь ». Откуда вы знаете, где в строке это было? Правильно, вы не можете, поэтому вместо того, чтобы дать вам персонажа, я расскажу вам, где он находится. Также в случае, если str1 короче str2, я возвращаю # str1 + 1, так как str2 будет продолжаться, для него будет nill для str1. Вы понимаете? – warspyking

 Смежные вопросы

  • Нет связанных вопросов^_^