2

私のdjangoテンプレートと競合するため、口ひげスタイルのアンダースコアテンプレート補間を行ったことを後悔しています。

既存のコードを壊すことなく、デフォルトの補間設定を使用する方向に進みたいと思います。

_明示的に切り替えることなく、2 つの補間正規表現を尊重することはできますか?

口ひげの正規表現:/\{\{(.+?)\}\}/g

元の+口ひげを一致させようとしましたが、成功しませんでした.

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

私の見掛け倒しの正規表現スキルにより、これが可能かどうかを判断できません。

4

1 に答える 1

3

_.templateimplementationを見ると、問題の根源がわかります。

_.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 組の区切り文字について心配する必要がなくなります。

于 2012-10-03T05:15:24.847 に答える