【问题标题】:In CMake, how do I check whether a string contains an integral number?在 CMake 中,如何检查字符串是否包含整数?
【发布时间】:2021-09-13 13:34:29
【问题描述】:

我在 CMake 中有一个字符串,我以某种方式在变量 MYVAR 中得到了它。我想检查该字符串是否为整数 - 可能带有空格。我有一个丑陋的方法:

string(REGEX MATCH "^[ \t\r\n]*[0-9]+[ \t\r\n]*$" MYVAR_PARSED "${MYVAR}")
if ("${MYVAR_PARSED}" STREQUAL "")
    message(FATAL_ERROR "Oh no!" )
endif()
# Now I can work with MYVAR as a number

有没有更好的方法?或者 - 我应该把它包装在一个函数中吗?

注意:我正在使用 here 中记录的 CMake 正则表达式语法。

【问题讨论】:

  • “我有一个丑陋的方法” - 你将“丑陋”命名为一个只包含简单的*+? 的正则表达式?在这种情况下,什么是 non-ugly 正则表达式?匹配精确字符串的正则表达式?或者您想使用正则表达式检查字符串 without 吗?好吧,您可以遍历字符串字符并应用简单的状态机,但我认为给定的方式并不比正则表达式更简单。不知道你想从我们这里得到什么。
  • @Tsyvarev:非丑陋的应该是:if (IS_NUMBER "${MYVAR}) 或类似的东西......而且,即使我使用正则表达式,也不必使用辅助变量。
  • "不丑的应该是:if (IS_NUMBER "${MYVAR})" - 你真的希望 CMake 能够检查很少使用的类型(使用E 的指数小数)?在您提出问题之前,我什至没有考虑过这种表示形式。 “另外,不必使用辅助变量,即使我确实使用了正则表达式。” - if(MYVAR MATCHES "<your-regex>")呢?这是 CMake 中完全有效的检查。
  • @Tsyvarev:你的观点很有道理。所以,让我们忘记指数。见编辑。

标签: regex cmake numbers idioms string-parsing


【解决方案1】:

选项 1:完全匹配

我想检查该字符串是否为整数 - 可能带有空格。

如果这是我需要的确切规格,那么我会这样检查:

string(STRIP "${MYVAR}" MYVAR_PARSED)
if (NOT MYVAR_PARSED MATCHES "^[0-9]+$")
    message(FATAL_ERROR "Expected number, got '${MYVAR}'")
endif ()

这首先从MYVAR 中删除空格,并将结果存储在MYVAR_PARSED 中。然后,它会检查MYVAR_PARSED 是否是一个非空的数字序列,如果不是,就会出错。

我认为临时做这个很好,但如果你想要一个功能:

function(ensure_int VAR VALUE)
  string(STRIP "${VALUE}" parsed)
  if (NOT parsed MATCHES "^[0-9]+$")
    message(FATAL_ERROR "Expected number, got '${VALUE}'")
  endif()
  set(${VAR} "${parsed}" PARENT_SCOPE)
endfunction()

ensure_int(MYVAR_PARSED "${MYVAR}")

选项 2:较弱的比赛

但是,根据您的要求,以下解决方案在某些情况下可能更可靠:

math(EXPR MYVAR_PARSED "${MYVAR}")

这会将MYVAR 的值解释为64 位有符号C 整数的简单数学表达式。它将以十六进制解释0x-前缀数字。它可以识别大多数 C 算术运算符。

另一方面,它可能过于宽松:此解决方案将接受 0 + 0x3 之类的内容。它还会根据表达式的损坏程度不同地发出警告或错误。但是,如果您随后验证数字的 范围 或其他内容,这可能不是问题。例如,您可以检查if (MYVAR_PARSED LESS_EQUAL 0),如果是,则出错。

math 命令的文档:https://cmake.org/cmake/help/latest/command/math.html

【讨论】:

  • 第一个解决方案是我正在使用的,只是更严格的 w.r.t.到空白,所以并没有真正回答我的问题。第二种解决方案 - 如果我使用它,我仍然需要检查 EXPR 会发生什么。我不介意过度放任w.r.t。符号,但是 - 这将接受非整数。就像我说的,这是一个多命令解决方案。所以,+1 表示努力,但 -1 表示糟糕的解决方案:-(
  • @einpoklum - 我不认为糟糕的解决方案是我的错。 CMake 语言不是为处理 math 命令和 if 数字比较之外的数字而构建的(这也是非常宽松的 w.r.t. 数字前缀)。我还要补充一点,math()根本不处理浮点
  • 你被正式免除了糟糕的解决方案:-) ...有趣的是数学中没有浮点;这让它好一点。并使用包装此功能的功能 - +1!
猜你喜欢
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2014-04-01
  • 1970-01-01
  • 2017-09-23
相关资源
最近更新 更多