【发布时间】:2015-05-25 17:53:41
【问题描述】:
我一直在使用 AutoIt 程序,该程序应该接收声明到 .ini 文件中的变量。稍后可以使用双大括号“{{}}”和单大括号“{}”调用这些变量。这是一个例子。
Variable is defined by user as: VAR1 = "C:\MyDir\"
When user calls {{VAR1}} it receives "C:\\MyDir\\"
When user calls {VAR1} it receives "C:\MyDir\"
双花括号将“\\”替换为“\”;单个大括号仅给出实际变量值。
问题是:
1) 用户可以在变量定义中使用大括号: {VAR1} = "C:\MyDir\" 或 {{VAR1}} = "C:\MyDir\" ...
2) 用户可以使用大括号编写文本并在文本内调用变量:
我的示例文本 {{{VAR1}}} 我的示例文本。
用户使用第二个 {{VAR1}} 大括号调用 {VAR1} 变量,并希望结果显示在第三个大括号内。
用户期望这样:“我的示例文本 {C:\MyDir} 我的示例文本。”
为了避免这种大括号递归的潜在问题,我想定义一个规则,当用户想要写一个真正的大括号时使用转义大括号“{”,当用户调用一个变量时使用非转义大括号.
根据前面的解释,我需要一个能够解析下面例子的正则表达式:
\{{{\{VAR1\}}}\}
必须忽略转义的大括号,函数应返回 \{VAR1\} 作为变量名。在这种情况下,变量“真实”名称是“{VAR1}”。
我希望你能帮助我。
最好的问候,
风神
【问题讨论】:
-
我已经构建了以下似乎有效的正则表达式 (?。任何人都可以评论这个可能的解决方案吗?
-
累积。对于 regex101.com,此正则表达式不正确,因为“lookbehinds 需要为零宽度,因此不允许使用量词”。这个固定的
(?<!\\)\{(?<!\\)\{(.*)(?<!\\)\}(?<!\\)\}模式匹配{{\{VAR1\}}},因为它正在寻找 2 个不以“\”开头的{s,然后是除换行符之外的任意数量的任何字符,然后是 2 个不带“\”的}s在前。所以,基本上,它是(?<!\\)\{{2}(.*)(?<!\\)\}{2}匹配{{\{VAR1\}}}。也许,您需要\\\{(?<!\\)\{{2}(.*)(?<!\\)\}{2}\\\}将整个\{{{\{VAR1\}}}\}与\{VAR1\}子组匹配?见regex101.com/r/lP5iW8/1。 -
Autoit 有一个 Execute() 函数,这可能是比在 Autoit 中创建编程语言更好的方法 :) 只是一个建议。
标签: regex variables autoit between curly-brackets