2016-11-28 42 views
1

我需要提取括號之間的表達式,其中可以包含所有內容但不包含非轉義的閉括號。排除範圍內的轉義字符

例如,來自[aaa\]bbbbbb]的正則表達式應給出結果:aaa\]bbbbbb

我試過這個:\[([^(?<!\\)\]]*)\]但是失敗了。

任何提示?

+0

太棒了,謝謝!我會花一些時間來理解工具頁面的解釋:) – sssimon

回答

1

您可以使用

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

或者 - 如果有可能是任何非轉義[在兩者之間非轉義[](如[a[\[aa\]bbbbbba\[aabbbbbb]),取出\[

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

查看regex demo 1regex demo 2。它是\[((?:[^][\\]|\\.)*)]正則表達式的unrolled variant

詳細

  • \[ - 一個[
  • ([^\]\[\\]*(?:\\.[^\]\[\\]*)*) - 第1個捕獲:
    • [^\]\[\\]* - 零個或多個字符比[]\其他(在一些正則表達式的口味,你可以寫出它沒有逃脫 - [^][\\]*
    • 0 -個
    • (?:\\.[^\]\[\\]*)*的零個或更多序列:
      • \\. - 任何轉義序列(\和比換行符字符以外的任何字符
      • [^\]\[\\]* - 比[零個或多個字符其他,]\
  • ] - 閉幕]
+0

你的正則表達式不會對''[a [\ [aa \] bbbbbba \ [aabbbbbb]'(括號內的另一個開口支架)' – Aserre

+0

@Aserre :當然,因爲非轉義的['和']'不平衡。沒有提到OP中這些場景的行爲應該是什麼。 –

+0

'我需要提取括號之間的表達式,可以包含所有內容但不包含非轉義的閉括號。:) :) – Aserre

0

這是(我認爲)的工作原理最簡單的正則表達式:

\[(.*?)(?<!\\)\] 

其捕獲括號中的文字爲組1

live demo