2017-01-06 2 views
2

Ich versuche den Unterschied im Text zwischen zwei String-Werten in Lua zu finden, und ich bin mir nicht ganz sicher, wie man das effektiv macht. Ich bin nicht sehr erfahren in der Arbeit mit Saitenmustern, und ich bin mir sicher, dass das mein Fall ist. Hier ein Beispiel:Den "Unterschied" zwischen zwei String-Texten finden (Lua-Beispiel)

-- 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")) 

In dem obigen Beispiel I zur Ausgabe des Text wollen würde, denn das ist der Unterschied zwischen den beiden Texten „“. Das Gleiche gilt für Fälle, in denen der Unterschied zu einem Bespannbild empfindlich sein könnte, wie folgt aus:

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

print(text2:match("pattern")) 

In diesem Beispiel I „(“ da zu diesem Zeitpunkt die neue Saite ist nicht mehr konsistent drucken würde wollen mit die alten.

Wenn jemand einen Einblick auf das hat, würde ich es wirklich schätzen. Leider habe ich nicht mehr geben könnte mit Code-weise zu arbeiten, ich bin nur nicht sicher, wo man anfangen soll.

+0

was sollte der unterschied sein für "hallo da" und "hallo htere" – Steve

+0

Idealerweise nur das "h" in "htere". Ich versuche nur genau zu finden, wo im geänderten Text, dass es nicht mehr konsistent ist, und schneiden Sie es an diesem Punkt und geben Sie den Unterschied zurück. Dieses zweite Beispiel war ein wenig irreführend, ich wollte eigentlich sagen, dass es "(" anstelle von "()" zurückgeben soll. Ich werde das beheben. – user7385467

+0

dann können Sie eine for-Schleife machen, um durch alle zu iterieren Zeichen in der Zeichenkette eins und vergleichen Sie mit Zeichenkette 2. Sobald Sie eine Nichtübereinstimmung finden, dann stoppen Sie – Steve

Antwort

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 

Verwendung:

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

Iterieren Sie einfach über die Zeichenfolgen und finden Sie, wenn sie nicht übereinstimmen.

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

Danke aber ich suche nicht nach der längsten Länge eines Textes, sondern nach dem * Unterschied * zwischen den beiden, dh der Unterschied zwischen "Hallo" und "Hallo" wäre "." – user7385467

+0

@ user7385467 index Sie können 's: sub (i, i)', um das Zeichen an diesem Index zu erhalten. Da zwei Strings beteiligt sind, welches Zeichen möchten Sie, die erste oder die zweite? Es ist trivial, diese Funktion zu ändern, um Ihnen zu geben das Ergebnis, das Sie brauchen – tonypdmtr

+0

@ user7385567 Ich bin Wenn ich den längsten Text nicht zurückgebe, gebe ich den Index zurück, in dem die Zeichenfolgen unterschiedlich sind. Zum Beispiel, wenn ich "." Woher weißt du, wo in der Schnur es war? Richtig, das kannst du nicht, anstatt dir den Charakter zu geben, sage ich dir, wo es ist. Auch in dem Fall, dass str1 kürzer als str2 ist, gebe ich # str1 + 1 zurück, da str2 fortgesetzt würde, denn es wäre nill für str1. Verstehst du? – warspyking

Verwandte Themen