2011-09-17 9 views
0

私はJavaScriptのテンプレートパーサーを作成していますが、私は最終的な解決策に近づいていますが、テンプレートのバインディングブロック(正規表現と一致しています) 。JavaScript正規表現 - すべて一致するものを除く

今私は、次のしている:

var codeblock = new RegExp("%\{[\S)]+\}%", 'g'); 

などに見えるテンプレートライン与えられた:

<td align="right" style="width: 123px;">%{toFixedEx(#{extendedPrice()}#,2,2)}%</td> 

は一致します:

%{toFixedEx(#{extendedPrice()}#,2,2)}% 

を私は空白を許可したいが%{}%の間に改行があるので、私は以下のregを試しましたEXP:マッチング終わる

var codeblock = new RegExp("%\{[\S\s)]+\}%", 'g'); 

試合は }%の代わりに、継続的に終了
%{ 
    if (condition) { 
     toFixedEx(#{surcharge()}#,2 ,4) 
    } 
    else { 
     toFixedEx(0,2,4) 
    } 
}% 

:私が行うことができるようにしたいどのような

%{toFixedEx(#{surcharge()}#,2 ,4)}%</td> 
<td align="right" style="width: 123px;">%{toFixedEx(#{extendedPrice()}#,2,2)}% 

のような試合なものですテンプレート内の最後の閉じ括弧に移動します。私は擬似文字クラスを試しましたが、JavaScriptで動作するようには見えません。

答えて

2
var codeblock = new RegExp("%\{[\S\s]+?\}%", 'g'); 

+?*?手段:できるだけ少ないとしてマッチREの次の部分の条件を満たすことができます。

[\S\s]はすべての文字(改行を含む)と一致するため、括弧を)から削除しました。

+0

ありがとう、私が探していたものをありがとう。 – dmck

+2

別の注釈(将来の読者に):多くのプログラマーは '.'を使用して、可能な限り一致することを期待しています。 '.'は改行とは一致しません。すべてをマッチさせるには、 '' \\\\\\\\\\\\\\ '' 'を使用する必要があります。これは、空白文字以外の文字*または*すべての空白文字を意味します。 –