2015-11-04 236 views
0

我目前正在嘗試使正則表達式匹配最接近的一對開合支架而沒有匹配轉義大括號。 (並且沒有匹配非轉義括號的雙轉義字符)。正則表達式匹配未轉義的大括號對

{"asd"} - {"asd"} 
\{"test"} - No match 
\\{"Apple juice}"} - {"Apple juice}"} 
{{"Test"}} - {"Test"} 

我已經很高興找到一個正則表達式剛剛maches轉義字符,而無需使用\K我已經試過許多東西,但我不明白,爲什麼這個表達式不起作用:((?<!\\)(?=(?:\\{2})*)){

+0

用什麼語言做你想做的事是什麼?是否需要更換? –

+1

4條線中哪條被認爲是匹配的?另外,您使用的是哪種Regex引擎? –

+1

既然你提到'\ K' - 是PCRE嗎?你是否也想忽略引號內的大括號?看看['(?<!\\)\\ [{}] |(\ {(?:「[^」\\] *(?:\\。[^「\\\ n] *) * 「| [^ {} \ n]的*)(:\\(?:?」[^ 「\\] *(?:\\ [^」 \\] *)*「| [^ {} \ n] *))*})'](https://regex101.com/r/wY0xG4/5)。 –

回答

1

您可以使用

(?<!\\)\\[{}]|(\{(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*)(?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*))*}) 

regex demo

正則表達式匹配2層的替代品:

  • (?<!\\)\\[{}] - 前一個轉義打開或關閉括號沒有\

OR(這一個被捕獲,這樣就可以通過訪問所述第一捕獲組抓住它)

  • (\{(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*)(?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*))*}) - 匹配和捕獲到組1以 開始的子串
    • \{ - 開括號
    • (?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*) - 包含任何轉義序列的引用字符串("[^"\\]*(?:\\.[^"\\]*)*")或0個或多個字符比{}[^{}]*
    • (?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*))*其他 - 匹配的0個或更多序列...
      • \\. - 轉義序列
      • (?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*) - 上述
    • 0見描述
  • } - 右括號