用于一次检测字符串和路径的正则表达式

RegEx for detecting a string and a path in one go

这是我需要的正则表达式示例regex

我在一个文件中有很多这样的行

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

我需要检测CXX_COMPILER___Debug之间的字符串,这里是testfoo2.

同时,我还需要检测整个文件路径/home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp,它总是出现在第一次匹配之后。

我想不出正则表达式。到目前为止,我有 .*CXX_COMPILER__(.\w+)_\w+|(\/[a-zA-Z_0-9-]+)+\.\w+ 并且我在打字稿中使用它,如下所示:

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

但是我没有匹配到。有没有简单的方法可以做到这一点?

看起来不错,但您需要分隔符。在正则表达式前后添加“/” - 无引号。

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);
}

它的末尾总是有 || <stuff here> 吗?如果是这样,这个基于您提供的正则表达式的正则表达式应该可以工作:

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

regex101 breakdown 所示,第一个捕获组应包含 CXX_COMPILER___Debug 之间的字符串,而第二个捕获组应包含路径,使用 space和管道来检测后者的结束位置。

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);
}

如果管道不会一直存在,那么这个版本应该可以代替(regex101):

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

但是它要求您在每次意识到可能存在新字符时单独添加所有有效路径字符,并且您需要确保路径没有 space,因为将 space 添加到正则表达式将使它检测 路径之后的内容。

这是我使用 replace 的方法:

I need to detect the string between CXX_COMPILER__ and _Debug, which is here testfoo2.

尝试将字符串中的所有字符替换为 CXX_COMPILER___Debug 之间的第一个捕获组 </code>:</p> <pre><code>/.*CXX_COMPILER__(\w+)_Debug.*/ ^^^^<--testfoo2

I need to also detect the entire file path /home/juxeii/projects/gtest-cmake-example/test/testfoo/testfoo2.cpp

同样,只是这次全部替换只留下第二个匹配组,这是我们第一个捕获组之后的任何内容:

/.*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,''))
console.log(line.replace(/.*CXX_COMPILER__(\w+)_Debug\s+(.*?)(?=\|\|).*/gm,''))