用于提取qmake变量的正则表达式

时间:2014-02-20 07:56:29

标签: regex non-greedy qregexp

我正在尝试编写QRegExp来从qmake项目代码(* .pro文件)中提取变量名称。
变量用法的语法有两种形式:

  • $$ VAR
  • $$ {VAR}

所以,我的正则表达式必须处理这两种情况。 我试图用这种方式写表达式:

\$\$\{?(\w+)\}?

但它没有按预期工作:对于字符串$$VAR我已经$$V匹配,禁用了“greeding”匹配模式(QRegExp::setMinimal (true))。据我了解,gready-mode在我的情况下会导致错误的结果。
那么,我做错了什么? 或者也许我应该使用贪婪模式而不关心这种行为:)

P.S。变量名不能包含空格和其他“特殊”符号,只能包含字母。

1 个答案:

答案 0 :(得分:2)

您无需禁用贪婪匹配。如果禁用贪婪匹配,则返回满足表达式的最小匹配。在您的示例中,不需要匹配AR,因为$$V会满足您的表达式。

重新打开最小模式,然后使用

\$\$(\w+|\{\w+\})

这匹配两个美元符号,后跟一串单词字符,或大括号之间的一堆单词字符。如果您可以信任您的数据不包含任何不匹配的大括号,那么您的表达式也可以正常工作 \w等于[A-Za-z0-9_],因此它匹配所有数字,所有大写和小写字母以及下划线。如果您想将其限制为仅使用字母表中的字母,请改用[A-Za-z]

由于变量名称不能包含任何特殊字符,因此不存在匹配过多的危险,除非变量可以通过更多常规字符直接跟随,在这种情况下它是不可判定的。
例如,如果数据包含类似Buy our new $$Varbuster!的字符串,其中$$Var应该是变量,则没有正则表达式将变量与字符串的其余部分分开。