2009-03-11 7 views
0

J'essaie de créer une petite application qui prend un modèle de texte de base avec des tableaux de mots spécialement étiquetés, analyse le contenu du modèle et génère un document texte généré aléatoirement.C# et regex pour les substitutions de mots avec des balises imbriquées

Essentiellement, ce que je suis en train de faire est de prendre ceci:

< {Bonjour | Salut | Howdy}> monde.

et la transformer en ceci:

 
Hello world. 
OR 
Hi world. 
OR 
Howdy world. 

Jusqu'à présent, si bon. Googling m'a assez pour être en mesure d'extraire avec succès le texte interne entre les < {et}> dans un tableau, à partir de laquelle puis je choisis au hasard un mot pour remplacer le plein < {Hello | Hi | Howdy}>.

Le problème que je rencontre est l'analyse d'un ensemble de mots imbriqués enveloppés dans les mêmes balises.

Par exemple, si je commence par ceci:

< {Bonjour | Salut | Howdy}> monde. < {Comment est < {vie | ça va}> | Comment êtes-vous?}>

Je voudrais en faire ceci:

 
Hello world. How's life? 
OR 
Hello world. How's it going? 
OR 
Hello world. How are you? 

et ainsi de suite ...

Quelqu'un pourrait-il suggérer un moyen de le faire assez simplement en utilisant C# et regex?

J'ai regardé http://www.vsj.co.uk/articles/display.asp?id=789 et http://www.m-8.dk/resources/RegEx-balancing-group.aspx, et pour être honnête, beaucoup de cela va bien au-dessus de ma tête, donc quelque chose de simple serait bien. ;-)

Merci.

Répondre

0

Si vous avez actuellement une regex qui peut correctement analyser les valeurs de votre tag dans un tableau (appelez-le A '), réappliquez cette regex pour chaque valeur dans A'.

Vous devriez être capable de le faire récursivement.

+0

Malheureusement, la grammaire décrite ci-dessus n'est pas régulière et donc vous ne pouvez pas utiliser regex. Vous avez besoin de la production S -> aBa, vous avez donc besoin d'un analyseur pour les langages sans contexte. –

+0

J'ai essayé ceci et je l'ai mis au travail. Probablement de meilleures façons de le faire. L'astuce consistait à créer une classe qui utilise la chaîne et le motif d'entrée, trouver une correspondance et renvoyer le tableau de texte interne, analyser en utilisant une chaîne remplacer et la passer à nouveau dans la classe de manière récursive jusqu'à ce que plus de regex corresponde.Merci. –

0

Ce problème n'est pas adapté aux expressions régulières. La grammaire nécessaire pour reconnaître l'expression que vous avez décrite n'est pas regular grammar.

Les expressions décrites ci-dessus peuvent cependant être décrites par un context-free grammar.

Vous devriez être en mesure d'analyser efficacement avec un LL(1) parser.Je dirais que le problème est mieux adapté pour symboliser l'entrée en utilisant lex et en construisant une arborescence de syntaxe abstraite en utilisant yacc.

Voici un tutoriel sur Grammars and parsing with C#

0

On dirait que vous essayez de décrire et d'utiliser un Context-Free Grammar plutôt qu'une expression régulière.

grammaires Contexte sont strictement plus puissants que les expressions régulières:

  • Toute langue qui peut être généré en utilisant des expressions régulières peuvent être générées par une grammaire hors-contexte.
  • Il existe des langages qui peuvent être générés par une grammaire sans contexte qui ne peut être générée par aucune expression régulière.

Pour C#, je vous recommande ANTLR, est un cadre pour la reconnaissance de langue, vous permet de construire, d'interprètes, de reconnaissance des compilateurs et des traducteurs de descriptions grammaticales.

Questions connexes