regex - CMake正则表达式匹配列表中的目录

标签 regex list cmake

所以我有这样的文件(或值)列表

set(HEADER_FILES DirA/header1.h DirA/header2.hpp
                DirB/header3.h DirB/stuff.hpp)

那么如何仅在 DirA 中获取文件的子列表?我正在使用 CMake 2.8.x 并且我厌倦了正则表达式匹配:
string(REGEX MATCHALL "DirA/(.+)" DirA_FILES ${HEADER_FILES})

但结果只是原始字符串的副本,例如:“DirA/header1.h DirA/header2.hpp DirB/header3.h DirB/stuff.hpp”或什么都没有。

和往常一样,在写这个问题时,我解决了它:
set(SubListMatch)
foreach(ITR ${HEADER_FILES})
    if(ITR MATCHES "(.*)DirA/(.*)")
        list(APPEND SubListMatch ${ITR})
    endif()
endforeach()

但是 CMake 对我来说是很新的东西,那么我如何将该代码包装成函数呢?到目前为止,我从未编写过任何 CMake 函数。

最佳答案

你可以把它变成这样的函数:

# Define function
function(GetSubList resultVar)
  set(result)
  foreach(ITR ${ARGN})  # ARGN holds all arguments to function after last named one
    if(ITR MATCHES "(.*)DirA/(.*)")
      list(APPEND result ${ITR})
    endif()
  endforeach()
  set(${resultVar} ${result} PARENT_SCOPE)
endfunction()

# Call it
GetSubList(SubListMatch ${HEADER_FILES})

当此代码运行时,SubListMatch将保存匹配的元素。

您可以通过例如改进功能给它一个额外的目录名参数,以便除 DirA 之外的其他参数。可以匹配:
function(GetSubList resultVar dirName)
  # as before, except the if()
    if(ITR MATCHES "(.*)${dirName}/(.*)")
  # same as before
endfunction()

关于regex - CMake正则表达式匹配列表中的目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15573655/

相关文章:

php - 使用正则表达式查找匹配的括号

r - R 中的列表和配对列表有什么区别?

c# - 如何使用 Linq 和 C# 迭代从字典返回的列表

python - Cython、CMake 和 setup.py、python 在子目录中编译两次

cmake - 为 cmake 指定库以从命令行链接到

java - JAVA将一个字符串分割成3个字符串,每个字符串都有自己的分隔符

ruby - 使用 Ruby 正则表达式处理空格的问题

c++ - 在Mac OS X Lion(10.8.2)上使用Xcode 4.6安装OpenCV。

regex - 我可以只对我通过的名称使用 find 进行可写性测试,而无需递归吗?

python - 如何分段打印长列表?