65 votes

Recherche de motifs en Lua et expressions régulières

Je suis en train d'apprendre le langage lua. En ce qui concerne le pattern-matching en lua, j'ai trouvé la phrase suivante dans la documentation de lua sur lua.org :

Néanmoins, la recherche de motifs en Lua est un outil puissant et comprend certaines fonctionnalités qui sont difficilement compatibles avec les implémentations POSIX standard.

Comme je suis familier avec les expressions régulières posix, j'aimerais savoir s'il y a des exemples communs où le pattern matching de Lua est "meilleur" que les expressions régulières -- ou ai-je mal interprété la phrase ? et s'il y a des exemples communs : pourquoi le pattern-matching par rapport aux expressions régulières est-il mieux adapté ?

0 votes

Un lien vers l'endroit où vous avez lu cela dans la documentation serait bienvenu

0 votes

@g33kz0r les documents sont disponibles à l'adresse suivante : lua.org/pil/20.1.html la citation est tirée du deuxième paragraphe (celui qui commence par : "Contrairement à plusieurs autres langages de script, ...) la dernière phrase.

69voto

Norman Ramsey Points 115730

Existe-t-il des exemples courants où la recherche de motifs en Lua est "meilleure" que l'expression régulière ?

Il ne s'agit pas tant d'exemples particuliers que du fait que les motifs Lua ont un rapport signal/bruit plus élevé que les expressions régulières POSIX. C'est la conception générale qui est souvent préférable, et non des exemples particuliers.

Voici quelques facteurs qui contribuent à une bonne conception :

  • Syntaxe très légère pour faire correspondre les types de caractères courants, y compris les lettres majuscules ( %u ), les chiffres décimaux ( %d ), les caractères d'espacement ( %s ), etc. Tout type de caractère peut être complété par l'utilisation de la lettre majuscule correspondante. %S correspond à tout caractère autre qu'un espace.

  • Les citations sont extrêmement simples et régulières. Le caractère de citation est % de sorte qu'il est toujours distinct du caractère de citation de la chaîne de caractères \ ce qui rend les motifs Lua beaucoup plus faciles à lire que les expressions régulières POSIX (lorsque les guillemets sont nécessaires). Il est toujours sûr de citer des symboles, et il n'est jamais nécessaire de citer des lettres, vous pouvez donc suivre cette règle empirique au lieu de mémoriser les symboles qui sont des métacaractères spéciaux.

  • Lua propose des "captures" et peut renvoyer plusieurs captures en tant que résultat d'une commande match appel. Cette interface est bien meilleure que la capture de sous-chaînes par le biais d'effets secondaires ou d'un état caché qui doit être interrogé pour trouver des captures. La syntaxe de capture est simple : il suffit d'utiliser des parenthèses.

  • Lua dispose d'une "correspondance la plus courte" - pour aller de pair avec le modificateur "longest match" * de l'opérateur. Ainsi, par exemple s:find '%s(%S-)%.' recherche la plus courte séquence de caractères sans espace précédée d'un espace et suivie d'un point.

  • Le pouvoir d'expression des motifs Lua est comparable à celui des expressions régulières POSIX "de base", sans l'opérateur d'alternance | . Ce que vous abandonnez, ce sont les expressions régulières "étendues" avec | . Si vous avez besoin d'une telle puissance d'expression, je vous recommande d'aller jusqu'à LPEG qui vous donne essentiellement la puissance des grammaires sans contexte à un coût tout à fait raisonnable.

0 votes

Merci -- beaucoup d'informations. je pense que je dois approfondir le pattern matching en lua, avant de comprendre pleinement ce qui est dit dans la phrase citée ...

5 votes

Le modificateur "shortest match" n'est-il pas identique à l'opérateur PCRE "frugal match" "*" ? ?

5 votes

Il y a aussi %bxy qui correspond à une paire équilibrée de délimiteurs, tels que des parenthèses ou des accolades. La correspondance entre parenthèses équilibrées ne peut pas être effectuée dans les expressions régulières POSIX. Il y a aussi le motif frontière qui est présent mais non documenté dans Lua 5.1, et qui devient une fonctionnalité documentée dans la version 5.2. L'expression wiki dit "Le modèle de la frontière %f suivi d'un ensemble détecte la transition de "pas dans l'ensemble" à "dans l'ensemble"" Cette opération est possible mais beaucoup plus verbeuse en regexp.

9voto

Keith Pimmel Points 38

http://lua-users.org/wiki/LibrariesAndBindings contient une liste des fonctionnalités, y compris les bibliothèques de regex, si vous souhaitez continuer à les utiliser.

Pour répondre à la question (et noter que je ne suis en aucun cas un gourou de Lua), le langage a une forte tradition d'utilisation dans les applications embarquées, où un moteur regex complet augmenterait indûment la taille du code utilisé sur la plateforme, parfois beaucoup plus que la bibliothèque Lua elle-même.

[Edit] Je viens de trouver dans la version en ligne de Programming in Lua (une excellente ressource pour apprendre le langage) où ceci est décrit par l'un des principes du langage : voir les commentaires ci-dessous [/Edit]

Personnellement, je trouve que le pattern matching par défaut fourni par Lua satisfait la plupart de mes besoins en matière de regex-y. Votre kilométrage peut varier.

0 votes

Ok -- je pensais que ce n'était pas seulement une question de taille. j'ai lu que la librairie de pattern matching de lua fait environ 500 loc par rapport aux librairies de regexp avec ~4000 loc -- c'est cool, mais je pensais que c'était aussi une question de commodité : je fais beaucoup de regexp et je sais que ce truc peut devenir très complexe et compliqué -- donc : y a-t-il d'autres caractéristiques qui rendent le pattern matching de lua plus pratique ou plus facile à utiliser ou ... que le regexp de posix ? ... que le regexp posix -- en dehors du loc ? merci de garder à l'esprit : il s'agit d'apprendre et non pas de s'enflammer.

0 votes

Je suis d'accord avec ce que Norman a posté (c'est pourquoi il obtiendrait mon upvote si j'avais la réputation !) Je ne peux pas ajouter grand-chose à cela, si ce n'est l'esthétique personnelle de l'utilisation de ce système - il me semble tout simplement meilleur. Encore une fois, YMMV :) FWIW, quand je passe d'un style de regex/modèle à un autre (sed vs. Lua, par exemple), cela me donne des maux de tête et me fait souvent courir après la documentation. J'ai tendance à rester dans l'outil que j'utilise le plus souvent pour cela, qui se trouve être Lua.

3voto

Yin Cognyto Points 162

Au risque de recevoir quelques downvotes pour avoir dit la vérité, je vais être franchement honnête (comme une réponse devrait l'être, après tout) : en dehors de la possibilité de renvoyer l'information sur le site web de l'Union européenne, il n'y a pas d'autre solution que d'utiliser le site web de l'Union européenne. plusieurs captures pour un seul appel de match (possible dans les expressions régulières, mais d'une manière beaucoup plus alambiquée) et l'option %bxy qui correspond à un équilibré de délimiteurs (par exemple, toutes sortes de parenthèses et autres) et peut être qualifié d'utile, de puissant et de "meilleur", presque tout ce que les motifs Lua peuvent faire, les expressions régulières peuvent le faire aussi .

Les lacunes des motifs Lua par rapport aux expressions régulières en ce qui concerne les "caractéristiques" sont en revanche significatives et trop nombreuses pour être mentionnées (par exemple, l'absence de OU, l'absence de groupes non capturables, les expressions de contournement, etc). Cela serait équilibré si, disons, les motifs Lua étaient significativement plus rapides que les expressions régulières habituellement plus lentes, mais je ne sais pas si - et où - une telle comparaison existe, une comparaison qui exclurait la vitesse native générale de Lua en raison de sa nature légère, de l'utilisation de tableaux, etc.

La vraie raison pour laquelle Lua n'a pas pris la peine d'ajouter les expressions régulières à sa boîte à outils ne peut pas être la longueur du code nécessaire (c'est absurde, les ordinateurs modernes ne bronchent même pas lorsqu'il s'agit de 4000 lignes de code contre "seulement" 500, même si cela se traduit un peu différemment dans une bibliothèque), mais est probablement due au fait qu'étant un langage de script, il a été supposé que le langage "parent" incluait déjà la capacité d'utiliser les expressions régulières. Il est évident que Lua, en tant que langage, a été conçu dans un souci de simplicité, de rapidité et avec seulement les fonctionnalités nécessaires à l'esprit. Cela fonctionne bien dans la plupart des cas, mais si vous avez besoin de plus de capacités dans ce domaine et que vous ne pouvez pas les reproduire en utilisant les autres fonctionnalités de Lua, les expressions régulières sont plus complètes.

L'avantage est que les différences de syntaxe entre les motifs Lua et les expressions régulières sont pour la plupart mineures, de sorte que si vous connaissez l'un, vous pouvez relativement facilement vous adapter à l'autre.

3voto

sdaau Points 6262

Ok, juste une petite note de noob pour cette discussion ; j'ai été particulièrement troublé par cette page :

Expressions régulières SciTE

puisque celui-ci dit \s correspond aux espaces blancs, comme je le sais d'après d'autres syntaxes d'expressions régulières... J'essaie donc dans un shell :

$ lua
Lua 5.1.4  Copyright (C) 1994-2008 Lua.org, PUC-Rio
> c="   d"
> print(c:match(" "))

> print(c:match("."))

> print(c:match("\s"))
nil
> print("_".. c:match("[ ]") .."_")
_ _
> print("_".. c:match("[ ]*") .."_")
_   _
> print("_".. c:match("[\s]*") .."_")
__

Hmmm... semble \s n'est pas reconnu ici - donc cette page fait probablement référence à l'expression régulière dans le Find/Replace de Scite - et non à la syntaxe regex de Lua (que scite utilise également).

Puis j'ai relu lua-users wiki : Tutoriel sur les modèles et commence à recevoir le commentaire sur le fait que le caractère d'échappement est % , pas \ en @NormanRamsey La réponse de l'auteur de l'article est la suivante. Alors, essayez ceci :

> print("_".. c:match("[%s]*") .."_")
_   _

... fonctionne en effet.

Ainsi, alors que je pensais à l'origine que les "patterns" de Lua étaient des commandes/moteurs différents des "expressions régulières" de Lua, je pense qu'une meilleure façon de le dire est la suivante : Les "patterns" de Lua sont la syntaxe/moteur d'"expressions régulières" spécifique à Lua (en d'autres termes, il n'y en a pas deux :) )

Santé !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X