2009-03-28 8 views
1

Travailler avec le système d'expressions régulières de Ant semble ne pas me poser de problème. Avec assez de travail, je peux généralement le faire fonctionner (et comprendre ce que je faisais mal plus tôt). Mais pas cette fois. J'ai une cible simple, dans laquelle je veux extraire le premier élément sur une propriété qui contient un ou plusieurs mots séparés par des virgules, comme ceci:Comment puis-je supprimer le premier élément d'une liste en utilisant replaceregex dans un fichier Ant?

tgt.list.full=word1,word2,word3,word4 

(Edit: tgt.list.full est effectivement peuplé par une autre propriété : tgt.list.basic, de sorte que la cfg.list.file réelle ressemble à ceci:

tgt.list.basic=word1,word2,word3,word4 
tgt.list.full=${tgt.list.basic} 

)

Je veux que le premier mot: "mot1" pour remplacer la propriété $ {cible}. C'est ce que ma tâche ressemble:

<target name="load-configuration-list"> 
    <loadproperties srcfile="${cfg.list.file}"> 
     <filterchain> 
      <containsregex pattern="^tgt.list.full=(.*),?.*" replace="target=\1" /> 
      <concatfilter prepend="${cfg.list.file}" /> 
     </filterchain> 
    </loadproperties> 
    <echo message="TGT: ${target}, FULL: ${tgt.list.full}"/> 
    <fail unless="target" message="A target cannot be determined"/> 
</target> 

Avec la version actuelle, j'ai énuméré sous la tâche « containsregex » $ {cible} obtient peuplé avec la liste complète (« mot1, mot2, mot3, word4 ») et pas simplement "word1". J'ai essayé un grand nombre de variations d'entre eux. Voici un exemple:

<containsregex pattern="^tgt.list.full=(word1),?.*" replace="target=\1" /> 

j'attendre à ce que cela au moins FORCER la propriété cible à être rempli, mais dans ce cas, $ {target} reste non définie (même pas la liste complète est mis en elle).

Il y a peut-être une faille dans ma logique de filtre. Je sais que je pourrais probablement écrire la tâche de mon propre, mais Ant semble pour avoir déjà les composants dont j'ai besoin, si je peux mieux les comprendre.

Pour reformuler ma question initiale: étant donné une liste séparée par des virgules dans une propriété Ant, comment puis-je utiliser une tâche Ant (pas nécessairement en utilisant containsregex ou replaceregex) pour extraire le premier élément?

Répondre

2

Cette regex serait-elle mieux adaptée à vos besoins?

^tgt.list.full=([^,]+),?.* 
^tgt.list.full=([^,]+),?[^\r\n]*$ 

Depuis '.' (point) représente un caractère, '(.*),?.*' ne sélectionne mot1, mot2, ... en raison de la greediness du * quantificateurs.
Peut être '(.*?),?.*' aurait été mieux, mais au moins avec [^,]+, nous savons qu'un opérateur gourmand ne capturera aucun ','.

La deuxième forme peut être nécessaire pour être sûr de ne capturer que ce qui est sur une ligne, et non pas « tout ce qui suit un , » (y compris les lignes suivantes, car « » en mode « dotall », peut inclure des caractères crlf).


Comme mentionné par Adam dans les commentaires:

Le "target" prop a été effectivement peuplée par "${tgt.list.basic}," non "full".
Donc, après que tout ait été résolu, la cible était maintenant remplie par la liste de base.
je me suis déplacé la liste complète sur le fichier .cfg à être rempli par la liste de base plus tard (au lieu immédiatement)

+0

Votre première réponse m'a touché assez en avant pour le faire fonctionner. Ceci: "^ tgt.list.full = ([^,] +),?. *" Plus réorganiser le tgt.list.full était suffisant pour résoudre le problème. – Adam

+0

Génial. Je suis content que ça a marché pour vous. – VonC

+0

Pour clarifier: Le prop "target" était en réalité peuplé par "$ {tgt.list.basic}", pas "full" donc après tout résolu, la cible était maintenant peuplée par la liste de base. J'ai déplacé la liste complète du fichier cfg pour être peuplée par la liste de base plus tard (au lieu de immédiatement). – Adam

Questions connexes