【问题标题】:Regex for extracting qmake variables用于提取 qmake 变量的正则表达式
【发布时间】:2014-02-20 07:56:28
【问题描述】:

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

  • $$VAR
  • $${VAR}

所以,我的正则表达式必须同时处理这两种情况。 我正在尝试以这种方式编写表达式:

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

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

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

【问题讨论】:

    标签: regex non-greedy qregexp


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 谢谢,一切正常。我只需要接受\w+ 表达式就可以捕获它。关于仅字母:不,变量的名称中可以包含数字,例如VAR11,但不能从它开始。
    • 好的,如果有问题,可以把\w+换成[A-Za-z]\w*
    • 关于$$Varbuster - 我认为Var 提取的不可能是显而易见的:) 除了使用黑魔法之外,如何区分一个字母...
    • [A-Za-z]\w* 表示“一个字母和不同数量的字母/数字”?
    • @Axilles 我认为这就是大括号的用途:Buy our new $${Var}buster!
    猜你喜欢
    • 2021-07-05
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多