2012-01-03 20 views
1

私はJSでの小枝/神社テンプレートパーサを構築、およびJavaScriptで以下の文字列を一致させる必要があるんだ:エスケープされた {を次の正規表現に追加するにはどうすればよいですか?

{%render "base"%} 
{% render "base" with {"color":"red0xFF0000", "number": 123} %} 

RegexBuddyに建てられたとこれまでのところ、私は、以下の正規表現を持っている:

\{% ?render *"[a-z0-9:._]+" ?((?:with +)({([^\{\}]*)}))? ?%} 

これは上記の両方のレンダリングタグに一致するように管理しますが、句の本文にエスケープされた\{\}を許可します。

私は今すべてを試しましたが、この100%を稼働させることはできません。私は、例えばそのような中括弧を追加する場合:

{% render "base" with {"color":"red\{0xFF0000\}", "number": 123} %} 

それだけでred過去の最初{で終了だって文字列が一致していません。

基本的には正規表現を一致させたいが、{の接頭辞は無視され、\という接頭辞は無視されます。

アイデア?

+1

なぜあなたは否定先読みを使用しないでください: ''またはオプションのグループ(\\?!): '(\\\})? ' –

+0

私はそれをしようとしていますが、それをどこに入れるのかはわかりません:) –

+1

FWIW、私はここで正規表現を使用しません。適切なトークンごとのパーサーは、より複雑ではなく(おそらくより効率的です)、IMHOです。 – You

答えて

0
{% ?render *"[a-z0-9:._]+" ?((?:with +)({[^{}\\]*(?:\\.[^{}\\]*)*}))? ?%} 

トリッキーな部分はこれです:オープニングブレース後

{[^{}\\]*(?:\\.[^{}\\]*)*} 

、それはブレースまたはバックスラッシュではないもののゼロ個以上の一致する - [^{}\\]*を。バックスラッシュを検出すると、その文字と次の文字(\\.)を消費します。エスケープされていない閉じ括弧に到達するまで、必要な回数だけそのプロセスを繰り返します。

0

関連部分を怠惰なグラブに変換できますか(。*?)? <正規表現の一部ではありません! <またはそのビット<またはこの....など

{% ?render *"[a-z0-9:._]+" ?((?:with +)({(.*?)}))? ?%} 
関連する問題