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

时间:2015-11-04 14:40:23

标签: regex regex-lookarounds

我正在尝试制作正则表达式以匹配最接近的一对开始和结束括号,而不匹配转义大括号。 (并且没有匹配非转义括号前面的双重转义字符。)

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

我已经很高兴找到一个正则表达式,只是在没有使用\K的情况下匹配未转义的字符我尝试了多个但我无法弄清楚为什么这个正则表达式不起作用:((?<!\\)(?=(?:\\{2})*)){

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

正则表达式匹配2个替代方案:

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

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

  • (\{(?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*)(?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*))*}) - 匹配并捕获到第1组以子字符串开头的子字符串
    • \{ - 大括号
    • (?:"[^"\\]*(?:\\.[^"\\]*)*"|[^{}]*) - 包含所有转义序列的引用字符串("[^"\\]*(?:\\.[^"\\]*)*")或除{}以外的0个或多个字符([^{}]*
    • (?:\\.(?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*))* - 匹配0个或更多个序列...
      • \\. - 转发序列
      • (?:"[^"\\]*(?:\\.[^"\\]*)*‌​"|[^{}]*) - 请参阅上面的说明
  • } - 右大括号