如何在CMake中获取正则表达式的组匹配?

6
让我们来看下面的实例。
set(TEXT "ab,cc,df,gg")
string(REGEX MATCHALL "((.)\\2)" RESULT "${TEXT}")
message("Result: ${RESULT}")  

# Expected:  Result: cc;gg
# Actual:    Result:

比较在regex101上的预期结果。
有人知道如何在上面的例子中正确检索匹配组1吗?这在CMake中是否可能?
我在网络上找不到有关CMake使用的正则表达式处理器限制的信息。谁知道更多?(在CMake FAQ中有一些关于此的简短说明)
感谢您的支持!
1个回答

3
CMake的正则表达式相对有限。请查看RegularExpression.cxx中的static char* regatom (int * flagp)方法。一个\\表示下一个字符被转义(按照字面意思处理)。看起来在CMake正则表达式中没有可用的反向引用。
解决办法是,您可以使用execute_process调用shell命令。
set(TEXT "ab,cc,df,gg")
message("TEXT: ${TEXT}")

execute_process(
    COMMAND echo ${TEXT}
    COMMAND sed "s/.*\\(\\(.\\)\\2\\).*/\\1/g"
    OUTPUT_VARIABLE RESULT OUTPUT_STRIP_TRAILING_WHITESPACE
    )

message("RESULT: ${RESULT}")  

这将产生以下结果:
TEXT: ab,cc,df,gg
RESULT: gg

你需要调整正则表达式以从给定的字符串中生成cc;gg

1
然而,这在 Windows 平台上并不可移植。 - Joakim

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