Question

Est-il possible de réaliser en Lua?

local noSlashEnding = string.gsub("slash\\ending\\string\\", "\\|/$", "")
-- noSlashEnding should contain "slash\\ending\\string"

local noSlashEnding2 = string.gsub("slash/ending/string/", "\\|/$", "")
-- noSlashEnding2 should contain "slash/ending/string"

Le point ici est l'acceptation sans des déclarations « ou » logiques dans les modèles Lua.


MODIFIER: Il suffit de réaliser ce qui est possible en faisant ceci:

strng.gsub("slash\\ending\\string\\", "[\\,/]$", "")

Bien que logique « ou » pour des motifs qui manque encore.

Était-ce utile?

La solution

Lua ne pas utiliser des expressions régulières standard pour la recherche de motifs. Une citation du livre Programmation en Lua explique la raison:

  

Contrairement à plusieurs autres langages de script, ne pas utiliser Lua expressions régulières (POSIX regexp) pour le filtrage. La principale raison est la taille: Une implémentation typique de regexp prend plus de Posix 4000 lignes de code. Ceci est plus grand que toutes les bibliothèques standard Lua ensemble. En comparaison, la mise en oeuvre de l'appariement de motif dans Lua a moins de 500 lignes. Bien sûr, la mise en correspondance de motif dans Lua ne peut pas faire tout ce que la mise en œuvre complète Posix fait. Néanmoins, la correspondance de motif dans Lua est un outil puissant et inclut des fonctionnalités qui sont difficiles à correspondre avec les implémentations de POSIX standard.

Cependant, il existe de nombreuses liaisons aux bibliothèques d'expressions régulières existantes et aussi l'avancée bibliothèque LPEG. Pour une liste avec des liens, voir http://lua-users.org/wiki/LibrariesAndBindings, chapitre Text processing.

En outre, voir cette question: pattern matching Lua par rapport à des expressions régulières

Autres conseils

pattern matching n'est pas la même chose que les expressions régulières, et ne dispose pas d'un concept de l'alternance.

Par exemple, si vous vouliez enlever "abc" ou "efg" de la fin d'une chaîne (similaire à "(abc|efg)$" expression régulière) le code suivant fonctionnerait bien:

local inputstring="123efgabc"
local s,n = inputstring:gsub("abc$", "")
if n == 0 then
  s,n = inputstring:gsub("efg$", "")
end
print(s) --> 123efg

Lua expressions régulières sont ... anormale. Pour autant que je peux dire de la documentation, il n'y a pas de soutien à l'alternance générale, ni pour appliquer les opérateurs de répétition aux groupes. Dans votre cas, comme vous le dites, vous pouvez obtenir ce que vous voulez avec une classe de caractères (je ne suis pas sûr de ce que la virgule fait dans votre classe de personnage, cependant).

Voir ici: http://www.lua.org/ manuel / 5.1 / manual.html # 5.4.1

(Dans un projet que je travaillais sur, nous avons écrit notre propre Lua se liant à PCRE à cause de cela.)

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