2010-09-03 2 views
1

J'ai une chaîne comme hello /world today/Lua Motif pour extraire/remplacer la valeur dans//

Je dois remplacer /world today/ avec /MY NEW STRING/

La lecture du manuel que j'ai trouvé

newString = string.match("hello /world today/","%b//") 

que je peux utiliser avec gsub pour remplacer, mais je me demandais est-il aussi un moyen élégant de renvoyer juste le texte entre le /, je sais que je pourrais juste couper, mais je me demandais s'il y avait un motif.

Répondre

2

Essayez quelque chose comme une des options suivantes:

  • slashed_text = string.match("hello /world today/", "/([^/]*)/")
  • slashed_text = string.match("hello /world today/", "/(.-)/")
  • slashed_text = string.match("hello /world today/", "/(.*)/")

Cela fonctionne parce que string.match renvoie des captures du motif, ou l'ensemble du texte correspondant si il n'y a pas de captures. La clé est alors de s'assurer que le motif a la bonne quantité de gourmandise, en se souvenant que les motifs Lua ne sont pas un langage d'expression régulière complète.

Les deux premiers doivent correspondre aux mêmes textes. Dans le premier cas, j'ai expressément demandé que le motif corresponde le plus possible à des non-barres obliques. La seconde (merci lhf) correspond à la plus courte durée de tous les caractères, suivie d'une barre oblique. Le troisième est plus gourmand, il correspond à la plus longue série de caractères qui peut encore être suivie d'une barre oblique.

Le %b// dans la question d'origine n'a aucun avantage sur /.-/ puisque les deux délimiteurs sont le même caractère.

Editer: Ajout d'un motif suggéré par lhf, et d'autres explications.

+0

Merci, je vais essayer. –

+1

Vous voulez probablement '" /(.-)/ "' au lieu de '" /(.*)/ "'. – lhf