CMake:如何在正则表达式替换中获取反斜杠字面值?

18

我想用反斜杠替换正斜杠。

为此,我有以下代码行:

STRING(REGEX REPLACE "/" "\\" SourceGroup ${SourceGroupPath} )

SourceGroupPath = A/File/Path. SourceGroup是变量,用于设置结果。

问题出在代码中的"\\"部分。 我尝试过多种方式来使用反斜杠字面量,如"\\" 和使用Unicode,但都无效。

CMake中报错信息为:

CMake Error at CMakeLists.txt:41 (STRING): string sub-command REGEX, mode REPLACE: replace-expression ends in a backslash.

请有人可以帮我解决一下吗?

谢谢,

Wouter


3
你尝试过使用 "\\\\" 吗? - Tomalak
2个回答

28
原因在于在CMake字符串文字中,反斜杠是转义字符(就像在C、Java或JavaScript中一样),而在正则表达式中,反斜杠也是一个转义字符。因此,要将正则表达式表示为字符串文字,您需要双重转义。(这也是许多“高级”语言具有正则表达式字面量符号的原因)。字符串文字“\”表示内存中的字符串“\”,这是一个无效的正则表达式,因此会出现“以反斜杠结尾”的错误。字符串文字“\\\\”表示内存中的“\”,这是一个有效的正则表达式(表示单个反斜杠)。

1
正斜杠呢? - Abid Rahman K
2
正则表达式中的斜杠“/”没有实际意义。如果主机语言使用斜杠来分隔正则表达式字面量,则它可能在主机语言中有意义,但在这种情况下,必须在正则表达式字面量内进行转义处理。(许多主机语言都是这样工作的,因此您可能会认为斜杠在正则表达式中具有某种特殊含义。但实际上并不是这样。) - Tomalak
@Angew 我猜 CMake 字符串的工作方式像 C 字符串一样? - Tomalak
@Tomalak 在这方面,是的,原则是相同的 - 反斜杠是一个转义字符。 - Angew is no longer proud of SO
好的。无论如何,你是正确的,我表述不够准确。我已经更正了我的帖子。 - Tomalak
显示剩余3条评论

15

是一个更简单的方法:

file(TO_NATIVE_PATH ${MYPATH} MYPATH)

1
一些构建环境(如MSYS)会混淆,需要手动路径转换,因为第三方可执行文件期望非posix样式的路径,因此需要手动字符串替换。 - tresf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接