2010-09-22 17 views
1

Je suis en train d'analyser un fichier journal et d'essayer de faire correspondre les instructions d'erreur. La partie de la ligne correspondant à "erreur CS" s'appliquera à de nombreuses lignes dont certaines ne sont pas dupliquées. Y at-il un moyen que je ne peux pas retourner les doublons. En utilisant la saveur Java de RegEx ..Regex pour renvoyer des lignes uniques lorsque le modèle correspond

exemple: mon retour simple, regex

Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty' 
Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context 
Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty' 
Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context 

aimerait qu'il revienne:

Class1.cs(16,27): error CS0117: 'string' does not contain a definition for 'empty' 
Class1.cs(34,20): error CS0103: The name 'thiswworked' does not exist in the current context 
+1

Quelle langue utilisez-vous, Java ou C#? – NullUserException

+0

Voir aussi: http://stackoverflow.com/questions/1863957/how-do-i-convert-an-array-of-strings-to-a-array-of-unique-values ​​ – kennytm

+1

Selon la structure de votre fichier journal des erreurs, vous pourriez être en mesure d'éliminer les doublons dans la regex. Mais je recommande de le faire après que vous ayez les correspondances, quelque chose comme ce que KennyTM a suggéré dans son lien ci-dessus – NullUserException

Répondre

2

Techniquement parlant, avec une expression régulière, cela est impossible. Vous avez besoin de quelque chose de plus puissant.

Les expressions régulières sont destinées à correspondre à des langages réguliers. Le motif que vous essayez de faire correspondre n'est pas régulier.

Vous avez besoin de l'expression pour mémoriser un certain 'état', les erreurs précédemment appariées, et les expressions régulières ne sont pas censées gérer ce type de calcul. Un Turing Machine est capable de sauvegarder l'état. C'est plus dans le sens de ce dont vous avez besoin. (Java s'adaptera bien à la facture.)

Cela pourrait être assez facilement résolu en ajoutant une logique supplémentaire dans votre analyseur de journal après avoir trouvé toutes les lignes d'erreur.

2

Une solution consiste à faire correspondre votre expression rationnelle et à placer la ligne dans une structure de données comme set qui traite de la suppression des doublons pour vous. À la fin de l'analyse, imprimez simplement le contenu de l'ensemble. Si vous êtes préoccupé par la commande, vous pouvez ajouter à une carte quelconque avec la ligne comme clé et le numéro de ligne comme valeur (en vérifiant peut-être une entrée correspondante avant l'insertion). Si vous triez par valeur, vous obtiendrez une liste de la première instance d'une ligne donnée.

+1

Regex à identifier, structure de données à filtrer. Différents outils servent différentes tâches. Si vous étiez un script shell, placez ceci à '| trier | uniq', par exemple (qui utiliserait plus de mémoire que quelque chose que vous pourriez programmer, mais c'est une autre histoire) –