匹配PostgreSQL中的部分反向引用

时间:2019-07-17 21:01:40

标签: regex postgresql backreference

我正在尝试使用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"}
}

1 个答案:

答案 0 :(得分:1)

您无法以所需的方式操作字符串替换模式实体。

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

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

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