_.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
、3 つのテンプレート区切り文字式のそれぞれに、キャプチャ グループが 1 つだけ含まれていると想定されます。noMatch
プレースホルダーは、/(.)^/
何にも一致しないようにするためのものですが、必要なキャプチャ グループはまだ含まれています。あなたの試行には、示されているように 2 つのキャプチャ グループが含まれています。
/(?:\{\{(.+?)\}\})|(?:\<\%\=(.+?)\%\>)/g
// ^^^ ^^^
2 番目の<%=...%>
グループは、あなたの問題の背後にあります。
おそらくこれで逃げることができます:
/(?:\{\{|<%=)(.+?)(?:%>|\}\})/g
しかし、それは<%= pancakes}}
andのようなもの{{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
そうすれば、上記のファンキーな正規表現や 2 組の区切り文字について心配する必要がなくなります。