web-dev-qa-db-fra.com

Correspondance de motifs Lua vs expressions régulières

J'apprends actuellement lua. concernant le filtrage de motifs dans lua, j'ai trouvé la phrase suivante dans la documentation de lua sur lua.org:

Néanmoins, la mise en correspondance de modèles dans Lua est un outil puissant et comprend certaines fonctionnalités qui sont difficiles à mettre en correspondance avec les implémentations POSIX standard.

Comme je connais les expressions régulières posix, j'aimerais savoir s'il existe des exemples courants où la correspondance de motifs lua est "meilleure" par rapport à l'expression régulière - ou ai-je mal interprété la phrase? et s'il existe des exemples courants: pourquoi les expressions de correspondance de motifs et d'expressions régulières sont-elles mieux adaptées?

62
aurora

Y a-t-il des échantillons courants où la correspondance de motifs lua est "meilleure" que l'expression régulière?

Ce ne sont pas tant des exemples particuliers que les motifs Lua ont un rapport signal/bruit plus élevé que les expressions régulières POSIX. C'est la conception globale qui est souvent préférable, pas des exemples particuliers.

Voici quelques facteurs qui contribuent à la bonne conception:

  • Syntaxe très légère pour faire correspondre les types de caractères courants, notamment 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é en utilisant la lettre majuscule correspondante, donc le motif %S Correspond à n'importe quel caractère non-espace.

  • La citation est extrêmement simple et régulière. Le caractère guillemet étant %, Il est donc toujours distinct du caractère guillemet \, Ce qui rend les modèles Lua beaucoup plus faciles à lire que les expressions régulières POSIX (lorsque la citation est nécessaire). Il est toujours sûr de citer des symboles, et il n'est jamais nécessaire de citer des lettres, vous pouvez donc simplement suivre cette règle empirique au lieu de mémoriser quels symboles sont des métacaractères spéciaux.

  • Lua propose des "captures" et peut renvoyer plusieurs captures à la suite d'un appel à match. Cette interface est beaucoup, beaucoup mieux que de capturer des sous-chaînes par des effets secondaires ou d'avoir un état caché qui doit être interrogé pour trouver des captures. La syntaxe de capture est simple: utilisez simplement des parenthèses.

  • Lua a un modificateur de "correspondance la plus courte" - Pour aller avec l'opérateur "de correspondance la plus longue" *. Ainsi, par exemple, s:find '%s(%S-)%.' trouve la séquence la plus courte de caractères non spatiaux précédée d'un espace et suivie d'un point.

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

67
Norman Ramsey

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

Pour répondre à la question (et notez que je ne suis en aucun cas un gourou de Lua), le langage a une forte tradition d'être utilisé dans des applications embarquées, où un moteur regex complet augmenterait indûment la taille du code utilisé sur la plate-forme , parfois beaucoup plus grande que la totalité de 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 la langue) où cela est décrit par l'un des principes de la langue: voir les commentaires ci-dessous [/ Edit]

Je trouve personnellement que le modèle par défaut correspondant à Lua répond à la plupart de mes besoins en regex-y. Votre kilométrage peut varier.

7
Keith Pimmel

Ok, juste une petite note noob pour cette discussion; Je suis particulièrement dérouté par cette page:

Expressions régulières SciTE

puisque celui-là dit \s correspond aux espaces, comme je le sais par d'autres syntaxes d'expressions régulières ... Et donc je l'essaye 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 Scite's Find/Replace - pas à la syntaxe regex de Lua (que scite utilise également).

Ensuite, j'ai relu lua-users wiki: Patterns Tutorial , et je commence à obtenir le commentaire sur le caractère d'échappement étant %, ne pas \ in @ NormanRamsey 's answer. Donc, essayez ceci:

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

... fonctionne effectivement.

Donc, comme je pensais à l'origine que les "modèles" de Lua sont des commandes/moteurs différents de "l'expression régulière" de Lua, je suppose qu'une meilleure façon de le dire est: les "modèles" de Lua sont la syntaxe/moteur spécifique à Lua "expression régulière" (en d'autres termes, il n'y en a pas deux :))

À votre santé!

1
sdaau