Frage

Ich habe diese Zeichenfolge in einem Lua -Skript bekommen:

one;two;;three;four;;five;;six;seven;

Der erste Char wird niemals ein Semikolon sein. Die mittleren Separatoren können ein einzelnes oder doppeltes Semikolon sein, und das letzte Zeichen kann ein einzelnes Semikolon sein oder nicht.

Verwenden der Lua -Muster (und string.gsub()): Wie kann ich mit den Doppel -Semikolonen in der Mitte übereinstimmen, um diejenigen durch eine einzelne zu ersetzen und das letzte optionale Semikolon zu löschen?

Die Ausgabe muss so sein:

one;two;three;four;five;six;seven

Ist dies mit einem einzigen Muster möglich?

War es hilfreich?

Lösung

Verwenden Sie ein Muster, um mehrere zu ersetzen ; Single ;, und ein anderer, um das letzte zu entfernen ; ich mag das

local str = "one;two;;three;four;;five;;six;seven;"
local result = str:gsub(';+', ';'):gsub(';*$', '')

Eine mögliche Möglichkeit, ein einzelnes Muster zu verwenden, ist wie folgt:

local result = (str .. ";;;"):gsub(";+", function(s) 
                                             if s == ";" or s == ";;" then 
                                                 return ";" 
                                             else 
                                                 return "" 
                                             end 
                                         end)

Ich versuche, drei anzuhängen ; bis zum Ende der Saite, also irgendwelche oder zwei ; sollte durch eins ersetzt werden ;. Und mehr ;(könnte drei oder vier sein und es muss am Ende sein) wird in leere Zeichenfolge ersetzt.

Ich würde die Lösung mit zwei Mustern bevorzugen, da sie klarer ist.

Andere Tipps

Wie wäre es mit so etwas:

function remove_extra_delim(s, delim)
    local t = {}
    for each in s:gmatch("[^"..delim.."]+") do
        table.insert(t, each)
    end
    return table.concat(t, delim)
end

teststr = "one;two;;three;four;;five;;six;seven;"
print(remove_extra_delim(teststr, ";"))

Ausgänge:

eins zwei drei vier fünf sechs sieben

Wenn die Anzahl der Semikolons entweder 1 oder 2 beträgt, können Sie es einfach tun

string:gsub(";;", ";")

Andernfalls leisten die anderen Antworten.

Es ist ein bisschen hackig, aber es macht den Trick:

x = test:gsub(";+(.?)",
  function(a)
    if a == "" then
      return ""
    else
      return ";" .. a
    end
  end)

(Hinweis: Ich folge genau Ihrer Beschreibung, also stimmen diese mit einem oder zwei überein; aber nicht mehr als zwei und endgültige Null oder nicht mehr als eins;

-- Method one uses two patterns but it's simpler and my preferred one
s = 'one;two;;three;four;;five;;six;seven;'
s = s:gsub(';;',';'):gsub(';?$','')
print(s)

-- Method two uses one pattern (if you really MUST use only one pattern)
s = 'one;two;;three;four;;five;;six;seven;'
s = (s..';'):gsub(';;',';')
s = s:sub(1,#s-1)
print(s)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top