正则表达式匹配未转义的大括号对

Regex to match unescaped pairs of braces

我目前正在尝试制作一个正则表达式来匹配最接近的一对左括号和右括号,而不匹配转义的大括号。 (并且没有匹配非转义括号前面的双转义字符)。

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

我已经很高兴找到一个只处理未转义字符而不使用的正则表达式 \K我已经尝试了很多东西,但我无法弄清楚为什么这个正则表达式不起作用:((?<!\)(?=(?:\{2})*)){

您可以使用

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

regex demo

正则表达式匹配 2 个选项:

  • (?<!\)\[{}] - 前面没有 \ 的转义左括号或右括号

或者(这个已经被捕获了,所以你可以通过访问第一个捕获组来获取它)

  • (\{(?:"[^"\]*(?:\.[^"\]*)*"|[^{}]*)(?:\.(?:"[^"\]*(?:\.[^"\]*)*‌​"|[^{}]*))*}) - 匹配并 捕获到第 1 组 以以下开头的子字符串
    • \{ - 左大括号
    • (?:"[^"\]*(?:\.[^"\]*)*"|[^{}]*) - 包含任何转义序列的带引号的字符串("[^"\]*(?:\.[^"\]*)*") 或除 {} ([^{}]*) 之外的 0 个或更多字符
    • (?:\.(?:"[^"\]*(?:\.[^"\]*)*‌​"|[^{}]*))* - 匹配 0 个或多个序列...
      • \. - 转义序列
      • (?:"[^"\]*(?:\.[^"\]*)*‌​"|[^{}]*) - 见上面的描述
  • } - 右大括号