【问题标题】:REGEX_Replace in CMAKE(do not understand the command properly)CMAKE 中的 REGEX_Replace(不正确理解命令)
【发布时间】:2018-01-29 15:36:59
【问题描述】:

很抱歉,这似乎是一个菜鸟问题,但我无法正确理解此命令,而且 Google 没有帮助我。

假设我有这个 CMake 脚本:

设置(OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/MyFolder) 字符串(正则表达式替换“/”“\”OUTDIR ${OUTDIR})

我在一本书中找到了一个类似的例子。我尝试阅读那里的解释以及文档,但我仍然不完全清楚 sn-p 的作用。正如我从文档中了解到的: REGER REPLACE 将在每次找到它时将“/”替换为“\”并在输出中返回结果。那么在这种情况下,输出会是什么?上面定义的路径的“OUTDIR”文件夹?我不明白为什么它是 'OUTDIR ${OUTDIR}' 而不仅仅是 '${OUTDIR}'。请通过解释 sn-p 来帮助我消除这种困惑。谢谢

【问题讨论】:

    标签: replace makefile cmake


    【解决方案1】:

    您对第一部分的理解几乎正确。问题是 REGEX REPLACE 之后的前两个字符串文字是两个 RegExes(正则表达式)。因此,此函数将在您指定的最后一个字符串中查找第一个 RegEx 的所有匹配项,并将它们替换为来自第二个 RegEx 的值。结果将保存在最后一个字符串变量之前。

    现在,在正则表达式中,一些字符具有特殊含义,它们被命名为特殊字符。反斜杠就是其中之一。如果您希望将此字符视为普通字符,则必须转义它,并在其前面加上一个反斜杠。

    现在,在 CMake 字符串文字中,您还必须转义反斜杠字符,在其前面放置另一个反斜杠。

    话虽如此,为了让您的代码将 OUTDIR 中的所有 / 替换为 \,您需要这样编写:

    set (OUTDIR ${CMAKE_CURRENT_BINARY_DIR}/MyFolder)
    string (REGEX REPLACE "/" "\\\\" OUTDIR ${OUTDIR})
    

    这是一个相关问题:CMake: how to get the backslash literal in Regexp replace?

    您可以在此处了解有关 RegEx 的更多信息:https://www.regular-expressions.info

    【讨论】:

    • 谢谢。现在说得通了。因此,它会查找第一个表达式,并在展开它并将结果存储在 OUTDIR 变量中后,将其替换为 ${OUTDIR} 中的第二个表达式:D。
    • 你能解释一下这个命令应该做什么吗?我无法理解第一个复杂的论点: string(REGEX REPLACE ".*v[0]*([0-9]+)\\.[0]*([0-9]+)\\ .[0]*([0-9]+).*" "\\1" MY_VAR ${MY_VAR} )
    • "REGEX REPLACE" 之后,第一个参数是 RegEx。据我了解,它检测到一个版本号。你可以在这里查看:regex101.com/r/cOqM9g/1 第二个 RegEx 是错误的。如果你想用数字 1 替换版本,它应该只是“1”,而不是“\\1”,因为 1 不是特殊字符,因此不需要转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多