我正在尝试编写QRegExp
来从qmake项目代码(* .pro文件)中提取变量名称。
变量用法的语法有两种形式:
所以,我的正则表达式必须处理这两种情况。 我试图用这种方式写表达式:
\$\$\{?(\w+)\}?
但它没有按预期工作:对于字符串$$VAR
我已经$$V
匹配,禁用了“greeding”匹配模式(QRegExp::setMinimal (true)
)。据我了解,gready-mode在我的情况下会导致错误的结果。
那么,我做错了什么?
或者也许我应该使用贪婪模式而不关心这种行为:)
P.S。变量名不能包含空格和其他“特殊”符号,只能包含字母。
答案 0 :(得分:2)
您无需禁用贪婪匹配。如果禁用贪婪匹配,则返回满足表达式的最小匹配。在您的示例中,不需要匹配AR
,因为$$V
会满足您的表达式。
重新打开最小模式,然后使用
\$\$(\w+|\{\w+\})
这匹配两个美元符号,后跟一串单词字符,或大括号之间的一堆单词字符。如果您可以信任您的数据不包含任何不匹配的大括号,那么您的表达式也可以正常工作
\w
等于[A-Za-z0-9_]
,因此它匹配所有数字,所有大写和小写字母以及下划线。如果您想将其限制为仅使用字母表中的字母,请改用[A-Za-z]
。
由于变量名称不能包含任何特殊字符,因此不存在匹配过多的危险,除非变量可以通过更多常规字符直接跟随,在这种情况下它是不可判定的。
例如,如果数据包含类似Buy our new $$Varbuster!
的字符串,其中$$Var
应该是变量,则没有正则表达式将变量与字符串的其余部分分开。