【问题标题】:Regex to select quote parameters正则表达式选择报价参数
【发布时间】:2017-09-27 14:22:24
【问题描述】:

我正在为表达式引擎模板语言组合一个语法高亮。我正在尝试仅在 {if} 标记内获取双引号及其值。

示例

{if layout:test == "test" || another == "value"}
 {if:elseif param == "value"}
 {if:else}
{/if}

正则表达式

{if.+?(?=")(")([^"]*)(")

问题是它只捕获第一个而不是下一个。我怎样才能让它只在一个条件块中选择它们?

所需的匹配项

"test", "value"

【问题讨论】:

  • 您的正则表达式有语法错误。请更正。

标签: regex expressionengine textmatebundles


【解决方案1】:

简介

我建议将您的逻辑分成两部分(2 个单独的正则表达式)。第一个正则表达式应该匹配 if 块,第二个应该匹配其中的变量。您无法在第一个 {if} 块中获取第二个变量的原因是正则表达式的工作方式。如果您匹配一个字符串,它们只会捕获 1 个组(除非您明确告诉它可能匹配 2 个组,在这种情况下,除非您这样做,否则您不会捕获第三组,等等)。


代码

捕获块

See this code in use here

{(?:(?<if>if(?=\s+))|(?<elseif>if:elseif(?=\s+)))\s*((?:[^"]*?|"[^"]*")*)\s*}

收集变量值

See this code in use here

[\w:]+\s*==\s*"([^"]*)"

结果

输入 - 捕获块

{if layout:test == "test" || another == "}"}
 {if:elseif param == "value"}
 {if:else}
{/if}

输出 - 捕获块

  • 群组if
    • 第 3 组:layout:test == "test" || another == "}"
  • 群组elseif
    • 第 3 组:param == "value"

输入 - 收集变量值

layout:test == "test" || another == "}"
param == "value"

输出 - 收集变量值

test
}
value

说明

捕获块

  • { 从字面上匹配这个字符
  • (?:(?&lt;if&gt;if(?=\s+))|(?&lt;elseif&gt;if:elseif(?=\s+)))if 捕获到名为if 的组中,后跟至少一个空格字符,或将if:elseif 捕获到名为elseif 的组中,然后至少有一个空白字符
  • \s* 匹配任意数量的空白字符
  • ((?:[^"]*?|"[^"]*")*) 捕获以下任意数量
    • [^"]*? 匹配除" 之外的任何字符任意次数,但越少越好
    • "[^"]*" 匹配一个",后跟除" 之外的任意字符任意次数,后跟"
  • \s* 匹配任意数量的空白字符

收集变量值

  • [\w:]+ 匹配任意单词字符 \w 或冒号 : 一次到无限次
  • \s* 匹配任意空白字符任意次数
  • == 匹配 == 字面意思
  • \s* 匹配任意空白字符任意次数
  • " 匹配 " 字面意思
  • ([^"]*) 捕获除" 之外的任何字符任意次数
  • " 匹配 " 字面意思

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2015-01-11
    • 2016-01-11
    相关资源
    最近更新 更多