Question

Je joue avec cela pendant une heure ou remorquer et moi-même avons trouvé à un barrage routier avec les utilitaires de correspondance de modèle Lua. Je tente de faire correspondre tout le texte cité dans une chaîne et le remplacer si nécessaire.

Le modèle que je suis venu avec à ce jour est le suivant: (\ [\ "\ ']?) (.-)% 1

Cela fonctionne dans certains cas, mais, pas tous les cas:

Working: "This \"is a\" string of \"text to\" test with"

Not Working: "T\\\"his \"is\' a\" string\" of\' text\" to \"test\" wit\\\"h"

Dans l'exemple qui ne travaillent pas, je voudrais qu'il corresponde à (je fait une fonction qui obtient les résultats que je désire, je suis à la recherche d'un modèle à utiliser avec gsub et curieux de savoir si un modèle de Lua peut le faire):

 string
 a" string" of
is' a" string" of' text
test
his "is' a" string" of' text" to "test" wit

Je vais continuer à utiliser ma fonction plutôt pour l'instant, mais je suis curieux de savoir s'il y a un modèle que je pourrais / devrais utiliser et je manque juste quelque chose avec des motifs.

(quelques modifications b / c j'ai oublié stackoverflows formating) (Une autre modification à faire un exemple non html depuis qu'il a été conduit à des hypothèses que je tentais de Parse html)

Était-ce utile?

La solution

essayez de faire correspondre échappé, texte cité en utilisant des expressions régulières est comme essayer d'enlever les marguerites (et seulement les dais) à partir d'un champ à l'aide d'une tondeuse à gazon.

  

J'ai fait une fonction qui obtient les résultats que je désire

Ceci est le mouvement correct.

  

Je suis curieux de savoir si un modèle de Lua peut le faire

D'un point de vue pratique, même si un modèle peut le faire, vous ne voulez pas. D'un point de vue théorique, vous essayez de trouver un guillemet qui est précédé par un nombre pair de barres obliques inverses. C'est certainement une langue régulière, et l'expression régulière que vous voulez serait quelque chose comme ce qui suit (Lua conventions citant)

[[[^\](\\)*"(.-[^\](\\)*)"]]

Et la chaîne entre guillemets serait le résultat # 2. Mais les modèles Lua sont pas pleines expressions régulières; en particulier, vous ne pouvez pas mettre un * après un modèle parenthésée. Alors Je pense que ce problème ne peut être résolu en utilisant des modèles Lua, mais étant donné que les modèles Lua ne sont pas une chose standard théorie des automates, je ne suis pas au courant d'aucun corps de la technique la preuve que vous pouvez utiliser pour le prouver.

Autres conseils

La question des citations échappées est que, en général, s'il y a un nombre impair d'antislash avant la citation, il est échappé, et s'il y a un nombre pair, ce n'est pas. Je ne crois pas que ltrage Lua est assez puissant pour représenter cette condition, donc si vous avez besoin de texte Parse comme ça, alors vous devriez chercher une autre façon. Peut-être que vous pouvez parcourir la chaîne et l'analyser, ou vous pouvez trouver chaque citation à son tour et lire à l'envers, en comptant les barres obliques inversées jusqu'à ce que vous trouviez un caractère non-backslash (ou le début de la chaîne).

Si vous devez absolument utiliser des modèles pour une raison quelconque, vous pourriez essayer de faire cela dans un processus en plusieurs étapes. Tout d'abord, gsub toutes les occurrences de deux barres obliques, et les remplacer par une valeur sentinelle. Cette doit être une valeur qui ne se produit pas déjà dans la chaîne. Vous pouvez essayer quelque chose comme « \ 001 » si vous connaissez cette chaîne ne contient pas de caractères non-imprimables. Quoi qu'il en soit, une fois que vous avez remplacé toutes les séquences de deux barres obliques, les antislashs gauche s'échappent le caractère suivant. Maintenant, vous pouvez appliquer votre modèle original, et puis finalement vous pouvez remplacer toutes les occurrences de votre valeur sentinelle avec deux barres obliques inverses à nouveau.

langage de modèle de Lua est suffisant pour de nombreux cas de simples. Et il a au moins un truc que vous ne trouvez pas dans un paquet d'expression régulière typique: une façon de correspondre entre parenthèses équilibrée. Mais il a ses limites aussi bien.

Lorsque ces limites sont dépassées, je tends la main LPEG . LPEG est une implémentation d'un Parsing Expression Grammer pour Lua, et a été mis en œuvre par l'un des auteurs originaux de Lua donc l'adaptation à Lua se fait assez bien. Un PEG permet de spécifier quoi que ce soit à partir de modèles simples par grammaires linguistiques complets à écrire. LPEG compile la grammaire à un bytecode et l'exécute de manière extrêmement efficace.

vous devez pas essayer d'analyser HTML avec des expressions régulières, HTML et XML sont pas langues régulières et ne peut pas être manipulé avec succès avec des expressions régulières. Vous devez utiliser un analyseur HTML dédié. Voici beaucoup d'explications pourquoi .

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