Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

417
Vistas
RegEx para detectar una cadena y una ruta de una sola vez

Aquí hay un ejemplo de qué expresiones regulares necesito expresiones regulares

tengo muchas de estas lineas en un archivo

 build test/testfoo/CMakeFiles/testfoo2.dir/testfoo2.cpp.o: CXX_COMPILER__testfoo2_Debug /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp || cmake_object_order_depends_target_testfoo2

Necesito detectar la cadena entre CXX_COMPILER__ y _Debug , que aquí es testfoo2 .

Al mismo tiempo, también necesito detectar la ruta completa del archivo /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp , que viene siempre después de la primera coincidencia.

No pude encontrar una expresión regular para esto. Hasta ahora tengo .*CXX_COMPILER__(.\w+)_\w+|(\/[a-zA-Z_0-9-]+)+\.\w+ y lo estoy usando en mecanografiado así:

 const fileAndTargetRegExp = new RegExp('.*CXX_COMPILER__(.\w+)_\w+|(\/[a-zA-Z_0-9-]+)+\.\w+', 'gm'); let match; while (match = fileAndTargetRegExp.exec(fileContents)) { //do something }

Pero no tengo coincidencias. ¿Hay una forma fácil de hacer esto?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

¿Tendrá siempre el || <stuff here> al final? Si es así, esta expresión regular basada en la que proporcionó debería funcionar:

/.*CXX_COMPILER__(\w+)_.+?((?:\/.+)+) \|\|.*/g

Como muestra el desglose de regex101 , el primer grupo de captura debe contener la cadena entre CXX_COMPILER__ y _Debug , mientras que el segundo debe contener la ruta, usando el espacio y las canalizaciones para detectar dónde termina el último.

 let line = 'build test/testfoo/CMakeFiles/testfoo2.dir/testfoo2.cpp.o: CXX_COMPILER__testfoo2_Debug /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp || cmake_object_order_depends_target_testfoo2'; const matches = line.match(/.*CXX_COMPILER__(\w+)_.+?((?:\/.+)+) \|\|.*/).slice(1); //slice(1) just to not include the first complete match returned by match! for (let match of matches) { console.log(match); }

Si las tuberías no siempre estarán allí, esta versión debería funcionar en su lugar (regex101) :

.*CXX_COMPILER__(\w+)_.+?((?:\/(?:\w|\.|-)+)+).*

Pero requiere que agregue todos los caracteres de ruta válidos individualmente cada vez que se dé cuenta de que podría haber uno nuevo, y deberá asegurarse de que las rutas no tengan espacios porque agregar espacio a la expresión regular haría que detecte el cosas después del camino también.

about 4 years ago · Juan Pablo Isaza Denunciar

0

Aquí está mi forma de hacerlo con replace :

Necesito detectar la cadena entre CXX_COMPILER__ y _Debug, que está aquí testfoo2.

Intente reemplazar todos los caracteres de la cadena con solo el primer grupo capturado $1 que se encuentra entre CXX_COMPILER__ y _Debug :

 /.*CXX_COMPILER__(\w+)_Debug.*/ ^^^^<--testfoo2

También necesito detectar la ruta completa del archivo /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp

Lo mismo, solo que esta vez reemplace todo, simplemente deje el segundo grupo coincidente, que es cualquier cosa que viene después de nuestro primer grupo capturado:

 /.*CXX_COMPILER__(\w+)_Debug\s+(.*?)(?=\\|\|).*/ ^^^<-- /home/.../testfoo2.cpp 

 let line = 'build test/testfoo/CMakeFiles/testfoo2.dir/testfoo2.cpp.o: CXX_COMPILER__testfoo2_Debug /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp || cmake_object_order_depends_target_testfoo2' console.log(line.replace(/.*CXX_COMPILER__(\w+)_Debug.*/gm,'$1')) console.log(line.replace(/.*CXX_COMPILER__(\w+)_Debug\s+(.*?)(?=\\|\|).*/gm,'$2'))

about 4 years ago · Juan Pablo Isaza Denunciar

0

Se ve bien, pero necesita delimitadores. Agregue "/" antes y después de Regex, sin comillas.

 let fileContents = 'build test/testfoo/CMakeFiles/testfoo2.dir/testfoo2.cpp.o: CXX_COMPILER__testfoo2_Debug /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp || cmake_object_order_depends_target_testfoo2'; const fileAndTargetRegExp = new RegExp(/.*CXX_COMPILER__(.\w+)_\w+|(\/[a-zA-Z_0-9-]+)+\.\w+/, 'gm'); let match; while (match = fileAndTargetRegExp.exec(fileContents)) { console.log(match); }

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda