我正在尝试解析http_proxy环境变量,但我遇到了一些问题。在bash中,这样做非常简单:
http_proxy_re='^https?://(([^:]{1,128}):([^@]{1,256})@)?([^:/]{1,255})(:([0-9]{1,5}))?/?'
问题是我需要在CMake中做同样的事情。我知道CMake中的正则表达式支持非常有限。到目前为止,我只能想出这样的东西:
string (REGEX REPLACE "^https?://([^:]+):([^@]+)@([^:/]+):([0-9]+).*$" "\\1 and \\2 and \\3 and \\4" RESULT "https://user:pass@localhost:8080")
它有效,但仅在提供用户和密码时才有效。 ? @之后似乎没有解决问题。有没有办法让用户在这种情况下传递可选项?
答案 0 :(得分:1)
?
在CMake的RE中有效,但如果它与任何内容不匹配,则无法引用\N
。您可以使用if
来检查它真正匹配的模式。
[STEP 101] # cmake --version
cmake version 3.7.2
[STEP 102] # cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
set(proxies "https://user:pass@localhost:8080" "https://localhost:8080")
set(re1 "^https?://([^:].*):([^@].*)@([^:/].*):([0-9]+).*$")
set(re2 "^https?://([^:/].*):([0-9]+).*$")
set(replace_re "^https?://(([^:].*):([^@].*)@)?([^:/].*):([0-9]+).*$")
foreach(proxy ${proxies})
if(proxy MATCHES "${re1}")
string(REGEX REPLACE "${replace_re}" "\\2 \\3 \\4 \\5" RESULT "${proxy}")
elseif(proxy MATCHES "${re2}")
#
# Here you cannot reference to \2 and \3 or CMake would complain
#
string(REGEX REPLACE "${replace_re}" "<n/a> <n/a> \\4 \\5" RESULT "${proxy}")
endif()
message("${RESULT}")
endforeach()
[STEP 103] # cmake .
user pass localhost 8080
<n/a> <n/a> localhost 8080
-- Configuring done
-- Generating done
-- Build files have been written to: /root/tmp
[STEP 104] #