Question

J'ai cette chaîne dans un script Lua:

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

Le premier char ne sera jamais un point-virgule. Les séparateurs moyens peuvent être un demi-point-virgule simple ou double, et le dernier char peut être ou non un seul point-virgule.

En utilisant les modèles LUA (et string.gsub()): Comment puis-je faire correspondre les doubles semi-virgules au milieu pour les remplacer par un seul et supprimer le dernier point-virgule en option?

La sortie doit être ceci:

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

Est-ce possible en utilisant un seul motif?

Était-ce utile?

La solution

Utilisation d'un modèle pour remplacer plusieurs ; selectionner ;, et un autre pour supprimer le dernier ; est comme ça

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

Une façon possible d'utiliser un seul modèle est ceci:

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

Ce que j'essaie de faire, c'est d'ajouter trois ; à la fin de la chaîne, donc un ou deux ; devrait être remplacé par un ;. Et plus ;(pourrait être trois ou quatre et il doit être à la fin) est remplacé en chaîne vide.

Je préférerais la solution avec deux modèles car il est plus clair.

Autres conseils

Que diriez-vous quelque chose comme ça:

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

Les sorties:

un deux trois quatre cinq six sept

Si la quantité de demi-colons est de 1 ou 2, vous pouvez simplement faire

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

Sinon, les autres réponses feront l'affaire.

C'est un petit hacky, mais il fait l'affaire:

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

(Remarque: je suis exactement votre description, donc ceux-ci correspondront un ou deux; mais pas plus de deux, et un zéro final ou un; mais pas plus d'un)

-- 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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top