CMake中string(REGEX REPLACE仅替换首个匹配项问题求助
问题原因及解决办法
你的问题出在两个核心点:
- 正则未转义特殊字符:目标内容里的
()是普通字符,但正则中()是捕获组的特殊标记,未转义会导致匹配逻辑偏离预期。 - 贪婪匹配覆盖多目标:原正则里的
.*是贪婪量词,会一次性匹配尽可能多的内容,把多个独立的old_prefix(...)项当成一个整体,最终只执行一次替换。
修正后的代码
file(READ file.h FILE_CONTENT) string(REGEX REPLACE "old_prefix\\((_[^)]*_postfix)\\)" "new_prefix(\\1)" FILE_CONTENT "${FILE_CONTENT}") file(WRITE file.h "${FILE_CONTENT}")
关键调整说明
- 给
()添加转义符\\,让正则将其作为普通字符识别。 - 把贪婪的
.*替换为[^)]*,表示匹配除)之外的所有字符,确保每个old_prefix(...)都被单独匹配,不会跨项覆盖。 - 给
${FILE_CONTENT}加上双引号,避免内容中的空格、换行等特殊字符被错误解析。
内容的提问来源于stack exchange,提问作者Nop
相关产品推荐
相关产品推荐

