2015-11-04 116 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见描述
  • } - 右括号