面对为不同供应商解析clang版本的问题clang --version|head -1
Apple LLVM version 6.0 (clang-600.0.54) (based on LLVM 3.5svn) => 3.5
FreeBSD clang version 3.4.1 (tags/RELEASE_34/dot1-final 208032) 20140512 => 3.4.1
clang version 3.5.0 (tags/RELEASE_350/rc2) => 3.5.0
现在有这个正则表达式
match: (clang version|based on LLVM)\ (\d+)(\.\d+)(\.\d+)?
to \2\3\4
我需要从结果匹配() - (clang version|based on LLVM)
中排除\1
。
答案 0 :(得分:2)
好的,因为你使用的工具是基于PCRE的,所以这种模式应该有效:
(?m)(?:^Apple .*)?\K \d+(?:\.\d+){1,2}
(?m)
在现实生活中没用,因为你只测试了一行,所以你可以删除它。
\K
会从匹配结果中删除左侧匹配的所有内容。
如果您使用其他语言/工具\K
功能不可用,您可以使用捕获组从整个匹配结果中提取所需信息:
(?:^Apple .*)? ([0-9]+(?:[.][0-9]+){1,2})
使用cmake:
string(REGEX REPLACE "(^Apple .*)? ([0-9]+([.][0-9]+){1,2}).*" "\\2" CLANG_VERSION "${_clang_version_info}")
答案 1 :(得分:2)
你的问题看起来好像你希望CMake的正则表达式处理类似于Perl,但它却完全不同。
在CMake语法中,以下内容应该符合您的要求:
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
execute_process(COMMAND clang --version COMMAND head -1 OUTPUT_VARIABLE ClangVersionLine)
string(REGEX MATCH "(clang version|based on LLVM) ([0-9]\\.[0-9]\\.?[0-9]?)" UnusedVar "${ClangVersionLine}")
set(ClangVersion "${CMAKE_MATCH_2}")
message("ClangVersion - ${ClangVersion}")
endif()