我有以下和regex
模板。template
underscore.js
问题是正则表达式interpolate
无法正常工作,什么是正确的正则表达式?
正则表达式
var settings = {
evaluate: /\{\{\#([\s\S]+?)\}\}/g,
interpolate: /\{\{[a-zA-Z](.+?)\}\}/g
};
模板
{{# if ( item ) { }}
{{ item.title }}
{{# } }}
我有以下和regex
模板。template
underscore.js
问题是正则表达式interpolate
无法正常工作,什么是正确的正则表达式?
正则表达式
var settings = {
evaluate: /\{\{\#([\s\S]+?)\}\}/g,
interpolate: /\{\{[a-zA-Z](.+?)\}\}/g
};
模板
{{# if ( item ) { }}
{{ item.title }}
{{# } }}
模板编译器将使用表达式中的最后一个捕获组来构建模板的 JavaScript 形式。在您的情况下,interpolate
遗嘱(如 Jerry 所述)忽略第一个字母字符,因此最终会在模板参数中{{ab}}
查找。b
您的正则表达式也不考虑前导空格。你会想要更像这样的东西:
/\{\{\s*([a-zA-Z](?:.+?))\s*\}\}/g
或者更好,只需省略原始组而不是将其转换为非捕获组:
/\{\{\s*([a-zA-Z].+?)\s*\}\}/g
或者更好的是,直奔问题的核心,准确地说出你的意思:
/\{\{([^#].*?)\}\}/g
我认为导致您使用原始正则表达式的问题interpolate
是之前检查过evaluate
;interpolate
该顺序在正在查找<%= ... %>
和evaluate
正在查找时是有意义的<% ... %>
(即正在使用默认分隔符)。在您的情况下,您需要一些额外的[^#]
技巧来绕过正则表达式检查顺序。
同样,我们可以简化您的evaluate
正则表达式:
/\{\{#(.+?)\}\}/g
演示:http: //jsfiddle.net/ambiguous/V6rv2/
我还建议您添加一个escape
完整的模式。