2009-01-20 6 views
0

J'ai un texte composé d'informations entourées d'un certain modèle. La seule chose que je sais est le modèle: "$ {template.start}" et $ {template.end} Pour le garder simple, je vais remplacer $ {template.start} et $ {template.end} par "a" dans l'exemple.Utilisation d'un astérisque dans un fichier RegExp pour extraire des données entourées d'un certain modèle

donc une entrée dans le texte serait:

aINFORMATIONHEREa 

Je ne sais pas combien de ces entrées concaténées dans le texte. Donc, ce qui suit est correct aussi:

aFOOOOOOaaASDADaaASDSDADa 

Je veux écrire une expression régulière pour extraire l'information incluse par les "a" s.

Ma première tentative était de faire:

a(.*)a 

qui fonctionne tant qu'il n'y a qu'une seule entrée dans le texte. Dès qu'il y a plus d'une entrée, il échoue, à cause du .* correspondant à tout. Donc, en utilisant a(.*)a sur aFOOOOOOaaASDADaaASDSDADa résultats dans un seul groupe de capture contenant tout entre le premier et le dernier caractère du texte qui sont « a »:

FOOOOOOaaASDADaaASDSDAD 

Ce que je veux obtenir quelque chose comme

captureGroup(0): aFOOOOOOaaASDADaaASDSDADa 
captureGroup(1): FOOOOOO 
captureGroup(2): ASDAD 
captureGroup(3): ASDSDAD 

Ce serait génial de pouvoir extraire chaque entrée du texte et de chaque entrée l'information qui est incluse entre les "a" s. En passant, j'utilise la classe QRegExp de Qt4.

Des indices? Merci! Markus


variation multiple de cette question ont été vu auparavant. Diverses discussions connexes:

et probablement d'autres ...

Répondre

5

utilisent simplement des expressions non gourmandes, à savoir:

a(.*?)a 
+0

C'était le bon indice pour moi! Merci! Dans Qt vous devez utiliser QRegExp :: setMinimal (true); pour atteindre le même je viens de découvrir. –

+0

. *? est plus clair tant que votre langage regex le supporte. – PEZ

3

Vous devez correspondre à quelque chose comme:

a[^a]*a 
0

Vous avez quelques réponses qui travaillent déjà, mais je vais ajouter un peu conseils gratuits:

Utilisation d'expressions régulières pour l'analyse syntaxique est une route pleine de dangers

Edit: être moins cryptique: pour tout ce qu'il ya puissance, la flexibilité et l'élégance, l'expression régulière ne sont pas suffisamment expressifs pour décrire tout mais les plus simples grammaires. Ils sont adéquats pour le problème posé ici, mais ils ne sont pas un remplacement approprié pour les analyseurs de machine d'état ou récursifs corrects si le langage d'entrée devient plus compliqué. Donc, choisir d'utiliser RE pour analyser les flux d'entrée est une décision qui doit être prise avec soin et avec un oeil vers le futur.

Questions connexes