2012-01-03 39 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

你爲什麼不使用負前瞻:''或可選的組(\\?!):'(\\\})? ' – 2012-01-03 14:26:34

+0

我正在嘗試,但不知道在哪裏滑。:) – 2012-01-03 14:30:03

+1

FWIW,我不會在這裏使用正則表達式。恕我直言,一個適當的逐個令牌解析器可能不太複雜(也可能更有效)。 – You 2012-01-03 14:34:22

回答

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

棘手的部分是這樣的:

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

左括號後,它匹配零個或更多的東西,這不是一個大括號或反斜槓 - [^{}\\]*。如果遇到反斜槓,則會消耗該字符和下一個字符 - \\.。它會根據需要多次重複該過程,直到它到達未轉動的右支撐。

0

您可以將相關部分轉換爲懶惰抓取任何內容(。*?)嗎? <不是正則表達式的一部分! <或該位<或這個....等

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