UnderscoreJS Interpolation Regex支持小胡子和原创?

时间:2012-10-03 04:50:42

标签: javascript regex underscore.js

我很遗憾去胡须式下划线模板插值,因为它与我的django模板冲突。

我想开始使用默认插值设置前进,而不会破坏现有代码。

我可以让_尊重两个插值正则表达式而不明确地在它们之间切换吗?

小胡子正则表达式:/\{\{(.+?)\}\}/g

我尝试过匹配原来的+胡子没有成功。

/(?:\{\{(.+?)\}\})|(?:\<\%\=(.+?)\%\>)/g

我伪劣的正则表达式技巧阻止我弄清楚这是否可能。

1 个答案:

答案 0 :(得分:3)

如果查看_.template implementation,您会看到问题的根源:

_.template = function(text, data, settings) {
  //...
  // Combine delimiters into one regular expression via alternation.
  var matcher = new RegExp([
    (settings.escape || noMatch).source,
    (settings.interpolate || noMatch).source,
    (settings.evaluate || noMatch).source
  ].join('|') + '|$', 'g');
  //...
  text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {

因此_.template期望三个模板定界符表达式中的每一个都包含一个捕获组; noMatch占位符仅为/(.)^/,因此它不会匹配任何内容,但它仍包含必需的捕获组。您的尝试包含两个捕获组,如下所示:

/(?:\{\{(.+?)\}\})|(?:\<\%\=(.+?)\%\>)/g
//       ^^^                 ^^^

第二个<%=...%>小组支持你的麻烦。

你可能可以逃脱这个:

/(?:\{\{|<%=)(.+?)(?:%>|\}\})/g

但是,这会将<%= pancakes}}{{pancakes %>等内容视为模板表达式。我认为你不必担心这样的事情。

也就是说,您应该可以使用一些非常简单的正则表达式工具自动将模板更新为您喜欢的样式,只需通过您喜欢的工具版本发送所有模板:

s/\{\{(.+?)\}\}/<%= $1 %>/g

在JavaScript中你有:

// read your template into old_school
new_school = old_school.replace(/\{\{(.+?)\}\}/g, '<%= $1 %>');
// replace your template with the content of new_school

然后你不必担心上面那个时髦的正则表达式或者有两组分隔符。