Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

414
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!