【问题标题】: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
输入 - 收集变量值
layout:test == "test" || another == "}"
param == "value"
输出 - 收集变量值
test
}
value
说明
捕获块
-
{ 从字面上匹配这个字符
-
(?:(?<if>if(?=\s+))|(?<elseif>if:elseif(?=\s+))) 将if 捕获到名为if 的组中,后跟至少一个空格字符,或将if:elseif 捕获到名为elseif 的组中,然后至少有一个空白字符
-
\s* 匹配任意数量的空白字符
-
((?:[^"]*?|"[^"]*")*) 捕获以下任意数量
-
[^"]*? 匹配除" 之外的任何字符任意次数,但越少越好
-
"[^"]*" 匹配一个",后跟除" 之外的任意字符任意次数,后跟"
-
\s* 匹配任意数量的空白字符
收集变量值
-
[\w:]+ 匹配任意单词字符 \w 或冒号 : 一次到无限次
-
\s* 匹配任意空白字符任意次数
-
== 匹配 == 字面意思
-
\s* 匹配任意空白字符任意次数
-
" 匹配 " 字面意思
-
([^"]*) 捕获除" 之外的任何字符任意次数
-
" 匹配 " 字面意思