如何添加转义\ {到以下正则表达式?

时间:2012-01-03 14:15:44

标签: javascript regex

我正在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}}。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

{% ?render *"[a-z0-9:._]+" ?((?:with +)({[^{}\\]*(?:\\.[^{}\\]*)*}))? ?%}

棘手的部分是:

{[^{}\\]*(?:\\.[^{}\\]*)*}

在左大括号之后,它匹配零或多个不是大括号或反斜杠的任何东西 - [^{}\\]*。如果遇到反斜杠,则会消耗该字符和下一个字符 - \\.。它会根据需要多次重复该过程,直到它到达未转动的闭合支撑。

答案 1 :(得分:0)

你能否将相关部分转换为懒惰抓取任何东西(。*?)? <不属于正则表达式! <或那个位<或者......等等。

{% ?render *"[a-z0-9:._]+" ?((?:with +)({(.*?)}))? ?%}