【问题标题】:Regular Expression - Get text between double curly brackets and avoid escaped curly brackets正则表达式 - 在双大括号之间获取文本并避免转义大括号
【发布时间】: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


【解决方案1】:

感谢 stribizhev 的更正以及“regex101.com”的链接(非常好的帮助来源)。是的,我的问题的一种解决方案是模式:(?<!\\)\{(?<!\\)\{(.*)(?<!\\)\}(?<!\\)\}

谢谢大家!

最好的问候,

风神

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    相关资源
    最近更新 更多