2017-01-18 59 views
2

鑑於像{大括號}的Javascript正則表達式 - 僅捕捉非轉義模式

{包括}什麼,但在Javascript中的字符串不是當他們被轉義 如{此}和工作的任何位置{括號}

我想要檢索

  • 包括
  • 花括號

我一直試圖找到一種方法,但沒有看後面我難倒。

最重要的是不要獲得轉義內容。如果有必要,我可以在比賽中包括大括號的東西。

不幸的是,到目前爲止,我還管理是這樣

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

的表達,但如果{是在目標文本的開頭不匹配。

任何人都可以幫助我嗎?謝謝。

+0

是否與''\''或'/'逃脫? –

+0

對不起 - 錯字的轉義字符。已更新 – Toby

+0

那麼,它仍然是'/'? :)如果沒有,你需要在正則表達式中使用''\\'''而不是'\ /'。 –

回答

5

我假設轉義字符是/

您可以使用與捕獲組以下的正則表達式,將保留您的值:

/(?:^|[^\/]){([^}]*)}/g 
      ^^^^^^^ 

regex demo

詳細

  • (?:^|[^\/]) - 無論是開始的字符串或字符以外的字符/
  • { - 字面{
  • ([^}]*) - 第1組捕獲比}其他任何0+字符(添加{進級到匹配{}之間的最短窗口)
  • } - 字面}

var rx = /(?:^|[^\/]){([^}]*)}/g; 
 
var str = "{include} anything in {curly braces} but not when they are escaped like /{this} and work for any position of the {brace}"; 
 
var m, res = []; 
 
while ((m = rx.exec(str)) !== null) { 
 
    res.push(m[1]); 
 
} 
 
console.log(res);

+0

如果你有''''作爲轉義字符,你需要將'[^ \ /]'改成'[^ \\]'。 –

+0

謝謝你Wiktor。這肯定會對我有用。我可以運行一些代碼來修剪輸出。 我對Javascript正則表達式並不是很強大,但出於興趣,你的方式和簡單的方式有什麼區別? ([^ \ /] | ^){。*?} 我並沒有真正得到?:或爲什麼([^}] *)的影響而不是。*? - 我在猜測我缺少的東西 我有興趣瞭解。謝謝 – Toby

+1

'{。*?}'會匹配換行符之外的{{,0+個字符,儘可能少到第一個'}'(所以它會匹配一行中的字符串)。另外,懶惰的'*?'會通過char匹配強制char,這會減慢整個事情的速度。用'{[^}] *}'儘可能多地匹配'{',除'''之外的任何0+字符,直到第一個'}'(即使內部有換行符,他們會得到匹配)。由於匹配是貪婪的,匹配速度在這裏更快。最好的做法是:如果你可以擺脫'。*'/'。*?'模式,用更精確的等效替換它們。 –