2009-11-16 7 views
2

J'ai frappé un petit bloc avec l'analyse de chaîne. J'ai une chaîne comme:Lua 'plain' string.gsub

footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr 

et j'ai du mal à utiliser gsub pour supprimer une partie de la chaîne. Normalement, je ferais ce

lineA = footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr 
lineB = footage/down/temp/cars_[100]_upper/ 
newline = lineA:gsub(lineB, "") 

qui normalement me donner « cars_ [100] _upper.exr »

Le problème est que gsub n'aime pas les [] ou d'autres caractères spéciaux dans la chaîne et contrairement à string.find gsub n'a pas la possibilité d'utiliser le drapeau 'plain' pour annuler la recherche de motif.

Je ne suis pas en mesure de modifier manuellement les lignes pour inclure des caractères d'échappement pour les caractères spéciaux car je fais un fichier de script de comparaison de fichiers.

Toute aide pour obtenir de lineA à newline en utilisant lineB serait la bienvenue.

Répondre

4

Vous pouvez utiliser une autre approche comme:

local i1, i2 = lineA:find(lineB, nil, true) 
local result = lineA:sub(i2 + 1) 
+0

Il suffit de le mettre dans une boucle jusqu'à trouver des rendements non nul pour correspondre à cette gsub remplace toutes les occurrences du motif. – sbk

+0

Cela ne marche pas non plus, car les caractères magiques string.find sont considérés comme tels (voir la réponse ci-dessous). – Gert

+1

Si le paramètre quatrième (self, pattern, init, plain) est vrai, la fonction ignore les caractères magiques du motif. – Kknd

7

Prendre de la page 181 de la programmation en Lua 2e:

Les personnages magiques sont:

() . % + - * ? [ ]^$ 

Le caractère « % 'fonctionne comme une évasion pour ces caractères magiques.

Ainsi, nous pouvons juste trouver une fonction simple pour échapper à ces personnages magiques, et l'appliquer à votre chaîne d'entrée (lineB):

function literalize(str) 
    return str:gsub("[%(%)%.%%%+%-%*%?%[%]%^%$]", function(c) return "%" .. c end) 
end 

lineA = "footage/down/temp/cars_[100]_upper/cars_[100]_upper.exr" 

lineB = literalize("footage/down/temp/cars_[100]_upper/") 

newline = lineA:gsub(lineB, "") 

print(newline) 

Lequel des impressions de cours: cars_[100]_upper.exr.

+0

Un autre moyen (probablement plus rapide) d'écrire littéralement: 'str: gsub (" [% (%)%. %%% +% -% *%?% [%]% ^% $] "," %%% 0 ")' – catwell

+0

EXCELLENTE approche. Note de côté: ouais, les motifs de lua sont sur le chemin la plupart du temps. 'Puissant'. Que diriez-vous utile? –

2

Vous pouvez également échapper à la ponctuation dans une chaîne de texte, str, en utilisant:

str:gsub ("%p", "%%%0")