在 qmake 文件中使用正则表达式

Posted

技术标签:

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

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

QString parseVersion()

   // https://regex101.com/r/nFMiA0/1
   QRegularExpression reR"((?:(\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 确实如此!如果你写一个答案,我会接受它。也许你能解释一下以前的尝试没有奏效吗?我对此有点困惑 【参考方案1】:

看看contains documentation:

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

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

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

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

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

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

【讨论】:

如果我只提取非贪婪子字符串怎么办? @Moia 根据我在文档中的理解,该方法仅返回 true 或 false。

以上是关于在 qmake 文件中使用正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式 不能为0

正则表达式 判断是否数字 js

是否可以在 azcopy 中使用正则表达式?

Linux正则表达式

尝试在java中使用正则表达式时堆栈溢出

用于提取部分文件路径的正则表达式