【问题标题】:Use regular expression in qmake file在 qmake 文件中使用正则表达式
【发布时间】:2021-04-12 10:17:44
【问题描述】:

我有这个正则表达式检查我的 cpp 文件中的版本号

QString parseVersion()
{
   // https://regex101.com/r/nFMiA0/1
   QRegularExpression re{R"((?:(\d+\.[.\d]*\d+)))"};
   if(auto match = re.match(VERSION); match.hasMatch()){
      return match.captured();
   }
   return "0.0.0";
}

我想把它移到 pro 文件中,比如

# pseudo code
contains(VERSION, ((?:(\d+\.[.\d]*\d+)))){
   // yada yada
}

假设VERSION 带有类似yada-1.2.3 的字符串

如何在 pro 文件中使用正则表达式?

【问题讨论】:

  • 我不知道您是否必须使用捕获组,但您也可以使用 \d+(?:\.\d+)+ 获得相同的匹配项
  • 看看docs可以为参数值指定正则表达式。 contains(OSDISTRO, \d+\.[.\d]*\d+){ 应该和你的正则表达式一样工作。
  • @WiktorStribiżew 它不适用于像yada-1.2.3这样的字符串
  • 好的,.*\d+(?:\.\d+)+ 有效吗?
  • @WiktorStribiżew 确实如此!如果你写一个答案,我会接受它。也许你能解释一下以前的尝试没有奏效吗?我对此有点困惑

标签: regex qt qmake


【解决方案1】:

看看contains documentation

可以为参数值指定正则表达式。

在你的情况下,你可以使用

contains(OSDISTRO, .*\d+(?:\.\d+)+) {
...
}

这里,模式是.*\d+(?:\.\d+)+,它匹配

  • .* - 尽可能多的零个或多个字符
  • \d+ - 一位或多位数字
  • (?:\.\d+)+ - 一个或多个点和一个或多个数字的重复。

这也意味着,模式必须匹配整个字符串,这就是之前的尝试失败的原因。

【讨论】:

  • 如果我只提取非贪婪子字符串怎么办?
  • @Moia 根据我在文档中的理解,该方法仅返回 true 或 false。
猜你喜欢
  • 1970-01-01
  • 2020-09-14
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多