Question

J'apprends actuellement lua. en ce qui concerne filtrages des lua je trouve la phrase suivante dans la documentation sur lua lua.org:

  

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.

Comme je suis familier avec les expressions régulières POSIX je voudrais savoir s'il y a des échantillons communs où pattern matching lua est « meilleure » par rapport à l'expression régulière - ou ai-je mal interpréter la phrase? et s'il y a des exemples courants: pourquoi est l'un des motifs de correspondance par rapport à des expressions régulières mieux

?
Était-ce utile?

La solution

  

Y at-échantillons communs où lua correspondance de motif est « mieux » par rapport à l'expression régulière?

Il est pas tant que des exemples particuliers que les modèles Lua ont un rapport signal-bruit plus élevé que les expressions régulières POSIX. Il est la conception d'ensemble qui est souvent préférable, pas d'exemples particuliers.

Voici quelques facteurs qui contribuent à la bonne conception:

  • syntaxe très léger pour faire correspondre les types de caractères communs, y compris en majuscules lettres (%u), chiffres décimaux (de %d), les caractères de l'espace disponible (%s) et ainsi de suite. Tout type de caractère peut être complété en utilisant la lettre majuscule correspondante, donc modèle %S correspond à tout caractère non-espace.

  • est extrêmement simple Citation et régulière. Le caractère citant est %, il est donc toujours distinct du caractère chaîne-\ citant, ce qui rend les modèles Lua beaucoup plus facile à lire que des expressions régulières POSIX (en citant est nécessaire). Il est toujours sûr de citer des symboles, et il ne faut jamais citer des lettres, de sorte que vous pouvez simplement aller par cette règle au lieu de mémoriser quels symboles sont métacaractères spéciaux.

  • Lua offre « capture » et peut renvoyer plusieurs captures à la suite d'un appel match. Cette interface est beaucoup, beaucoup mieux que la capture par sous-chaînes d'effets secondaires ou ayant un état caché qui doit être interrogé pour trouver des captures. syntaxe de capture est simple:. entre parenthèses juste d'utilisation

  • Lua a un modificateur de - "match le plus court" pour aller de pair avec le "match le plus long" opérateur *. Ainsi, par exemple s:find '%s(%S-)%.' trouve la plus courte séquence de caractères non-espace qui est précédé par l'espace et suivi d'un point.

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

Autres conseils

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 pas un gourou Lua), la langue a une forte tradition d'être utilisé dans les applications embarquées, où un moteur regex plein augmenterait indûment la taille du code utilisé sur la plate-forme, parfois beaucoup plus vaste que toute la bibliothèque Lua lui-même.

[Modifier] Je viens de découvrir dans la version en ligne de programmation en Lua (une excellente ressource pour l'apprentissage de la langue) lorsque cela est décrit par l'un des principes de la langue: voir les commentaires ci-dessous [/ Modifier]

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

Ok, juste une légère note Noob pour cette discussion; Je suis particulièrement confus par cette page:

SciTE expressions régulières

depuis que l'on dit des matches de \s blancs, que je connais d'autres syntaxes d'expression régulière ... Et donc je suis en train 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 ne soit pas reconnu ici - de sorte que la page se réfère probablement à l'expression régulière dans la Recherche de Scite / Remplacer - pas à la syntaxe regex de Lua (qui SCITE également des utilisations).

Alors je relis lua utilisateurs wiki: modèles Tutorial , et commencer à obtenir le commentaire sur le caractère d'échappement étant %, pas \ dans @NormanRamsey 's réponse. Donc, essayez ceci:

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

... ne fonctionne en effet.

Alors, comme je l'ai d'abord pensé que les « modèles » de Lua sont différentes commandes / moteur de « expression régulière » de Lua, je suppose une meilleure façon de le dire est: « Les modèles » Lua sont Lua syntaxe spécifique de / moteur « expression régulière » (autrement dit, il n'y a pas deux d'entre eux :))

Vive!

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