Domanda

Ho ottenuto questa stringa in uno script Lua:

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

Il primo carattere non sarà mai un punto e virgola. I separatori centrali possono essere un punto a punto singolo o doppio e l'ultimo carbone può essere o no un singolo punto e virgola.

Usando i modelli LUA (e string.gsub()): Come posso abbinare i doppi punti e virgole nel mezzo per sostituirli con uno solo ed eliminare l'ultimo punto e virgola?

L'output deve essere così:

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

È possibile usando un singolo modello?

È stato utile?

Soluzione

Usando uno schema per sostituire più ; a single ;, e un altro per rimuovere l'ultimo ; è come questo

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

Un modo possibile per usare un singolo modello è così:

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

Quello che sto cercando di fare è aggiungere tre ; alla fine della stringa, quindi uno o due ; dovrebbe essere sostituito con uno ;. E altro ;(Potrebbe essere tre o quattro e deve essere alla fine) viene sostituito in una stringa vuota.

Preferirei la soluzione con due schemi in quanto è più chiaro.

Altri suggerimenti

Che ne dici di qualcosa del genere:

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

Output:

uno due tre quattro cinque sei sette

Se la quantità di punti e virgola è 1 o 2, puoi semplicemente farlo

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

Altrimenti, le altre risposte lo faranno.

È un po 'hacky, ma fa il trucco:

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

(Nota: sto seguendo esattamente la tua descrizione, quindi questi corrisponderanno a uno o due; ma non più di due, e finali zero o uno; ma non più di uno)

-- 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)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top