Question

J'ai une chaîne comme hello /world today/

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 là aussi une façon élégante de revenir tout le texte entre le /, je sais que je pouvais couper, mais je me demandais s'il y avait un motif.

Était-ce utile?

La solution

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 toutes les captures du motif ou l'ensemble du texte correspondant s'il n'y a pas de captures. La clé est alors de faire en sorte que le modèle a la bonne quantité de greediness, se rappelant que les modèles Lua ne sont pas une langue d'expression régulière complète.

Les deux premières doit correspondre aux mêmes textes. Dans le premier, je l'ai expressément exigé que le match de modèle que beaucoup de non-slash que possible. La seconde (grâce LHF) correspond à la durée la plus courte de tous les caractères dans l'ensemble, suivie d'une barre oblique. Le troisième est gourmand, il correspond à la plus longue durée de caractères qui peuvent encore être suivies d'une barre oblique.

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

Edit:. Ajout d'un modèle suggéré par lhf, et plus d'explications

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top