Expresión regular (Rexep) con agrupación para el sistema de compilación de texto sublime 2

StackOverflow https://stackoverflow.com/questions/8812973

  •  26-10-2019
  •  | 
  •  

Pregunta

Estoy tratando de implementar la captura de errores con sublime Text 2 Build System para un menos preprocesador en Windows. Necesito una sola expresión regular con agrupación para el nombre de archivo con ruta y número de línea de error.

La salida de preprocesador está siguiendo:

ERR: 
  type: Parse
  message: Syntax Error on line 6
  index: 131
  filename: D:\workflow\less-css\test\test.less
  line: 6
  extract:   asd,},
[Finished]

Aquí hay pautas de expresión regulares para file_regex opción:

La opción File_regex utiliza una expresión regular de estilo Perl para capturar hasta cuatro campos de información de error de la salida del programa de compilación, a saber: nombre de archivo, número de línea, número de columna y mensaje de error. Use grupos en el patrón para capturar esta información. Se requiere el campo Nombre del archivo y el campo Número de línea.

Recientemente comencé a aprender expresiones regulares, por lo que cualquier ayuda es muy apreciada. Nuevamente, Regexp debería devolver 2 elementos del grupo: nombre de archivo con ruta y número de línea. Ambos están presentes en la producción de preprocesador.

Gracias Stefan

¿Fue útil?

Solución

Espero que las capturas no tengan que estar en el orden que describe. Esto capturará el mensaje, el nombre del archivo y el número de línea en los búferes 1, 2 y 3.

/message:\s+(.+?)\s*\n.*filename:\s+(.+?)\s*\n.*line:\s+(.+?)\s*\n/s

Dado su error de ejemplo anterior, las capturas serían

1: Syntax Error on line 6
2: D:\workflow\less-css\test\test.less
3: 6

Alternativamente, utilizando las afirmaciones de LookAhead, el siguiente código PHP almacena las cosas en el orden correcto

<?php
$err = '
ERR:
  type: Parse
  message: Syntax Error on line 6
  index: 131
  filename: D:\workflow\less-css\test\test.less
  line: 6
  extract:   asd,},
';
$re = '/(?=.*filename:\s+(.+?)\s*\n)(?=.*line:\s+(.+?)\s*\n)()(?=.*message:\s+(.+?)\s*\n)/s';
preg_match($re, $err, $match);
print_r($match);
?>

Tenga en cuenta que he insertado una captura vacía como marcador de posición para el número de columna. Si el valor con la etiqueta 'Índice' es el número de columna, simplemente duplique el otro campo captura y altere el texto.

PRODUCCIÓN

Array
(
    [0] => 
    [1] => D:\workflow\less-css\test\test.less
    [2] => 6
    [3] => 
    [4] => Syntax Error on line 6
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top