2017-08-24 1 views
1

Je me suis récemment converti en iTerm2, et l'une des fonctionnalités les plus cool est la capacité de "capturer" des expressions régulières - utile pour intercepter les erreurs et les avertissements du compilateur/interprète panneau comme un IDE.Regex pour capturer les erreurs et les avertissements de g ++ et python

Comment configurer une regex pour capturer les erreurs/avertissements g ++ et les erreurs de trace Python? Une erreur levée par Clang est:

filename.c:54:9: error: use of undeclared identifier 'foo' 

qui se traduit par l'expression régulière:

^([a-zA-Z0-9+/.-]+):([0-9]+):[0-9]+: (?:error|warning): 

un python retraçage pourrait être de la forme:

Traceback (most recent call last): 
    File "main.py", line 664, in Run 
    self.TriangulatePoints(None, show=True) 
    File "main.py", line 570, in TriangulatePoints 
    error = gis.triangulate() 
    File "~/scripts/terrain.py", line 208, in triangulate 
    if int(self.dem_data[ny][nx]) != NDV: 
IndexError: index 432 is out of bounds for axis 0 with size 432 

et g ++:

points_lib.cpp:70:17: note: initializing argument 3 of ‘void CellsInCircle(int, float, int)’ 
extern "C" void CellsInCircle(int maxDiameter, float cellSize, int arrayCellsInCircle) 
      ^~~~~~~~~~~~~ 
points_lib.cpp: In function ‘void PlacePointsIO(double*, double*, int, int, char*)’: 
points_lib.cpp:553:56: error: cannot convert ‘std::vector<std::vector<std::vector<int> > >’ to ‘int’ for argument ‘3’ to ‘void CellsInCircle(int, float, int)’ 
CellsInCircle(maxEdge, cellSize, arrayCellsInCircle); 

Merci beaucoup! Mon regex-foo est inexistant.

+0

Est-il exact que vous voulez que le nom de fichier et de la ligne? – linden2015

Répondre

2

Une tentative pour encapsuler les erreurs, les avertissements et une mention de la 'ligne':

(?=.*(?:error|warning|line).*).*?(?<file>\w+\.\w+).*?(?<line>\d+)

(?=.*(?:error|warning|line).*) // look ahead and match one of the words possibly enclosed by white-space 
.*?       // possibly any white-space 
(?<file>\w+\.\w+)    // filename with 1 char before and after dot 
.*?       // possibly any white-space 
(?<line>\d+)     // line as first sequence of digits 

Demo

+0

Magnifique! Fonctionne à merveille. –