我有以下正则表达式:
/{%\h?if ((?:@)?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:[a-zA-Z0-9_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))*)\h?%}([\s\S]*){%\h?end if\h?%}/U
它基本上符合以下内容:
{% if variable %}
whatever stuff
{% end if %}
我正在尝试修改它以匹配上面的内容或像这样:
{% if variable %}
some stuff
{% else %}
whatever stuff
{% end if %}
之后我希望能够说if else_capture_group is not empty, then do something
。
我试着看负面的前瞻:
{%\h?if ((?:@)?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:[a-zA-Z0-9_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*))*)\h?%}([\s\S](?!{% else %}))(?:{%\h?else\h?%}([\s\S]*))?{%\h?end if\h?%}
但按照:https://regex101.com/r/wP4vS9/1,它不起作用......我不确定为什么。有人能指出我正确的方向吗?
答案 0 :(得分:1)
在这里,我尝试缩短它并添加了一个驯化的贪婪令牌,以使其与可选的else
块一起使用:
(?s){%\s*if\s+(?<var>@?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:(?1)))*)\h*%}(?<if>(?:(?!{% e(?:lse|nd if) %}).)*)(?:{%\h*else\h*%}(?<else>[\s\S]*?))?{%\h*end if\h*%}
请参阅regex demo
一些细节:
{%\s*if\s+(?<var>@?(?:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*)(?:\.(?:(?1)))*)\h*%}
- 我们捕获var
部分的第一部分(捕获组可能需要调整,但想法很明确)(?<if>(?:(?!{% e(?:lse|nd if) %}).)*)
- 匹配并捕获if
代码块的驯化贪婪令牌(?:{%\h*else\h*%}(?<else>[\s\S]*?))?
- 与?
部分相匹配的可选(由于else
结尾)组{%\h*end if\h*%}
- end
分隔符