lua pattern, convertir la regex : "(?:\\s|^)Hello world"

Espace ou début

a marqué ce sujet comme résolu.
Auteur du sujet

Bonjour,

Je voudrais savoir comment dire "espace ou début" en lua, pour avoir :

Hello world => true
ohHello world => false
oh Hello world => true

En regex ça s’écrit : (?:\\s|^)Hello world(?:\\s|$) mais comment on fait en lua avec text:gsub ?

(A l’occasion je voudrais savoir la fin aussi)

Bon vol,

A.

✈️ // 🐺 Ami des loups // 🎮 Coding Game // 🐤 Twitter @A312_zds // :B // L’hiver vient // @**A-312** pour me ping

+0 -0

Coucou,

Pour remplacer les espaces en début et fin de chaîne de caractère (généralement appelé fonction trim) tu peux utiliser le bout de code suivant :

str    = " Hello world "
result = str:gsub ("^%s*(Hello world)%s*$", "%1")

print (result)

quelques explications :

  • le ^ indique qu’on veut matcher un élément où la chaîne commence par ce qui va suivre
  • là on veut du coup matcher les caractères non imprimables (espace, etc.), on utilise donc %s*, l’étoile * indiquant qu’on s’attend à en avoir 0, 1 ou plusieurs
  • ensuite on met un groupe de capture avec les parenthèses pour récupéré son contenu
  • enfin on remet le match des caractères non imprimables
  • et on met un $ pour indiquer que la chaîne doit se terminer par ce qui précède

Voilà en espérant que tu es bien tout compris :)

Bon ✈ à toi aussi :D

ps : tu as également Perl comme petit langage dans le même genre qui est génial pour la gestion des chaînes de caractères

Édité par Heziode

+1 -0

Salut,

La doc dit ceci sur ^ et $:

A pattern is a sequence of pattern items. A '' at the beginning of a pattern anchors the match at the beginning of the subject string. A '$' at the end of a pattern anchors the match at the end of the subject string. At other positions, '' and '$' have no special meaning and represent themselves.

En clair tu ne peux ni écrire (%s|^) ni (%s|$), ça ne fonctionnera pas. En lua, tu n’as pas non plus de parenthèses non capturantes (?:...), et pas non plus d’autres possibles équivalents à ^et $ comme \a, \A, \z, \Z qu’on pourrait utiliser.

Note que (?:\s|^) et (?:\s|$) pourraient être remplacés par \b suivant les cas. En fait \b correspond à un truc genre (?<\w)(?=\W)|(?<\W)(?=\w) plus communément apelé limite de mot. Peu importe, de toute façon ça n’existe pas non plus en lua.

Vu que, qoi qu’on fasse, on ne peut pas conditionner sur un ancrage au début ou à la fin, je ne pense pas que ce soit faisable avec une seule regex. La seule alternative me parait être de découper la chaine en mots:

for word in str:gmatch('%S+') do
...
end

Ma plateforme avec 23 jeux de société classiques en 6 langues et 13000 joueurs: http://qcsalon.net/ | Apprenez à faire des sites web accessibles http://www.openweb.eu.org/

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte