我正在JS中构建一个Twig / Jinja模板解析器,需要在JavaScript中匹配以下字符串:
{%render "base"%}
{% render "base" with {"color":"red0xFF0000", "number": 123} %}
到目前为止,我有以下正则表达式,内置RegexBuddy:
\{% ?render *"[a-z0-9:._]+" ?((?:with +)({([^\{\}]*)}))? ?%}
这设法匹配上面的两个渲染标记,但是,我想允许将\{
和\}
转义为with {...}
子句的正文。
我现在已经尝试了一切,但却无法100%完成这项工作。当我像这样添加一个花括号时:
{% render "base" with {"color":"red\{0xFF0000\}", "number": 123} %}
字符串不匹配,因为它在{
之后的第一个red
终止。
基本上,我希望正则表达式匹配,但忽略前缀为{
的{{1}}。
有什么想法吗?
答案 0 :(得分:0)
{% ?render *"[a-z0-9:._]+" ?((?:with +)({[^{}\\]*(?:\\.[^{}\\]*)*}))? ?%}
棘手的部分是:
{[^{}\\]*(?:\\.[^{}\\]*)*}
在左大括号之后,它匹配零或多个不是大括号或反斜杠的任何东西 - [^{}\\]*
。如果遇到反斜杠,则会消耗该字符和下一个字符 - \\.
。它会根据需要多次重复该过程,直到它到达未转动的闭合支撑。
答案 1 :(得分:0)
你能否将相关部分转换为懒惰抓取任何东西(。*?)? <不属于正则表达式! <或那个位<或者......等等。
{% ?render *"[a-z0-9:._]+" ?((?:with +)({(.*?)}))? ?%}