cmake正则表达式解析http_proxy环境变量

时间:2017-12-13 14:19:59

标签: regex cmake

我正在尝试解析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")

它有效,但仅在提供用户和密码时才有效。 ? @之后似乎没有解决问题。有没有办法让用户在这种情况下传递可选项?

1 个答案:

答案 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] #