2011-08-25 73 views
0

我想要獲取由一些自定義「括號」包圍的文本,即:{{...}}或@(...)@高效正則表達式適用於「環繞」狀況,如{{....}}

當括號中只有一個字符的長度(即:{..}),它是:

/{(.*?)}/g 

並有一個更有效的解決方案,採用「未端托架」圖案:

/{([^}]*)}/g 

但是對於雙字符括號,只有這個作品

/{{(.*?)}}/g 

我無法找到一個有效的解決方案,就像一個字符的情況。

有沒有?

+1

如果有,會發生什麼逃逸{{嵌套{{括號}}? }} –

+0

目前我不需要嵌套括號。我只需要括號中的水平,一個表示變量的{..}和一個表示內部js代碼的@ {..} @。這是一個簡單的模板。 –

回答

3

我假設你不需要擔心嵌套。如果你願意,你不應該使用正則表達式。

這裏有一種方法做你想要什麼,而無需使用非貪婪匹配(*?):

/{{([^}]|}[^}])*}}/g 

英文:

  • 兩個花括號
  • 一些數量:
    • 一個非花括號
    • 或一個花括號followe d由非大括號
  • 和兩個接近的大括號

這通過具有n個單獨的分支,一個用於非捲曲,一個用於捲曲並概括出到n-大括號非捲曲,一個兩個花括號和非捲曲等

在你的特殊情況下,你可以只寫:

/{{(}?[^}])*}}/g 

BTW:該組可能不需要被捕獲。例如:

/{{(?:}?[^}])*}}/g 
+0

謝謝!這使我從很多頭痛中救了我:) –

+0

我以前不知道(?:)。謝謝:) –

+1

@勞倫斯:這是微不足道的使用模式嵌套分隔符,如[這個答案](http://stackoverflow.com/questions/4031112/regular-expression-matching/4034386#4034386)所示。你無法用DFA解決'(。+)\ 1',但這並沒有阻止任何人在正則表​​達式中使用它。真正的問題是Javascript的模式太原始了。更糟糕的是,你無法在Javascript中使用Unicode模式匹配(每UTS#18),因爲它是** [所有被調查語言中排名第一的最差的**](http://training.perl.com/ OSCON2011/index.html)用於Unicode模式匹配。即使PHP更好。 – tchrist

1

假設你有{{...}}

var subject= "{{i am legend}}"; 
var pattern = /(?:{{)([\w\W]*)(?:}})/; 
var text= subject.match(pattern)[1]; 

您可能需要包括取決於哪個 「括號」 你選擇

+0

在大多數情況下,這比OP開始時效率要低很多*。這也是不正確的,因爲它會將'{{abc}} def {{ghi}}'視爲一場比賽。 –