在 PostgreSQL 中匹配部分反向引用

Match partial backreference in PostgreSQL

我正在尝试使用 regexp_replace 函数清理格式错误的 JSON 字符串。我有如下字符串:

{ 0: {"foo": "bar", "baz": "24/05/2016", "qux": "12"}, 
  1: {"foo": "bar", "baz": "04/11/2015", "qux": "13"}, 
  2: {"foo": "bar", "baz": "25/07/2016", "qux": "14"}
}

为了使这个有效 JSON,我需要用双引号将数字键括起来。我不想捕获每个嵌套对象中的现有数值数据。

我最初想使用反向引用,匹配那些后跟冒号的数字,但当然捕获的反向引用包含冒号,我不想用引号引起来。

regexp_replace("column_to_fix", '\d:', '"\&"', 'g') as "cleaned"

不会完全这样做,因为每个带有冒号 \d: 的数字键都会被引号括起来,而不仅仅是数字。从概念上讲,使用 python 语法,我想用 "\&[-1]" 替换匹配。是否可以获取反向引用的子字符串?

我努力的结果是:

{ "0": {"foo": "bar", "baz": "24/05/2016", "qux": "12"}, 
  "1": {"foo": "bar", "baz": "04/11/2015", "qux": "13"}, 
  "2": {"foo": "bar", "baz": "25/07/2016", "qux": "14"}
}

您无法按照自己的方式操作字符串替换模式实体。

改为使用捕获组并在替换模式中对其进行相应的反向引用:

regexp_replace("column_to_fix", '([0-9]+):', '"":', 'g') as "cleaned"

此处,([0-9]+): 会将一个或多个数字捕获到第 1 组中,并且只匹配一个冒号,匹配项将被替换为第 1 组中双引号和冒号内的这些数字将附加到此子字符串。