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?
¿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.
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.*/ ^^^^<--testfoo2Tambié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'))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); }