我有以下和regex模板。templateunderscore.js
问题是正则表达式interpolate无法正常工作,什么是正确的正则表达式?
正则表达式
var settings = {
evaluate: /\{\{\#([\s\S]+?)\}\}/g,
interpolate: /\{\{[a-zA-Z](.+?)\}\}/g
};
模板
{{# if ( item ) { }}
{{ item.title }}
{{# } }}
我有以下和regex模板。templateunderscore.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完整的模式。