CMake中的奇怪字符串(REGEX REPLACE)行为

时间:2017-01-05 09:39:49

标签: c++ regex sed cmake

我有一个字符串“abc def ghi”,我想使用CMake将其拆分为“abc”和“def ghi”。在我的脚本中,我有以下两行:

string(REGEX REPLACE "[ ].*" "" NAME ${VAR} )
string(REGEX REPLACE "^[^ ]*[ ]" "" OPTIONS ${VAR} )

第一行按预期工作,但第二行始终只输出最后提供的参数。我尝试使用sed复制我的问题,以检查我的模式是否存在任何问题并找到以下结果:

  • echo "abc def ghi" | sed "s/^[^ ]*[ ]//"输出“def ghi”
  • echo "abc def ghi" | sed "s/^[^ ]*[ ]//g"输出“ghi”

所以我的问题似乎是string(REGEX REPLACE)使用它的最后一个操作的输出作为下一个操作的输入,就像在第二个sed命令中一样。在string的文档中,它说:

  

REGEX REPLACE将尽可能多地匹配正则表达式,并将替换表达式替换为输出中的匹配。

但是没有提到观察到的“管道输出”行为,这使得^运算符在我的情况下无用。这是多重匹配正则表达式的众所周知的行为吗?是否可以强制^仅匹配第一个输入的实际开始,而不是每个连续输入的开始?

1 个答案:

答案 0 :(得分:0)

string(REGEX MATCHALL "[ ](.*)" OPTIONS ${LIB} )替换第二行做我想做的事(忽略前导空格,但这不是什么大问题)。但是,它仍然没有回答关于此CMake函数之外的更一般上下文中的预期行为的问题以及更严格的使用^