向与正则表达式模式匹配的字符串添加逗号,但距离几个字符

问题描述 投票:0回答:2

我正在尝试在字符串中添加逗号和空格。以下是一些示例:

{大象:1,FENNEC_FOX:1NAKED_MOLE:1URCHIN:2}

{DUNG_BEETLE:12URCHIN:1}

{DUNG_BEETLE:1FENNEC_FOX:1URCHIN:2}

注意不一致地缺少“,”。我希望结果是

{大象:1、FENNEC_FOX:1、NAKED_MOLE:1、海胆:2}

{DUNG_BEETLE:1,海胆:1}

{DUNG_BEETLE:1、FENNEC_FOX:1、URCHIN:2}

我想我需要使用

REGEXP_REPLACE(my_string, ':[0-9]+[a-z_A-Z]', replacement)
。但我不太确定如何使
replacement
成为冒号,无论数字是什么,逗号和空格,以及匹配的字母是什么。

sql regex string postgresql regexp-replace
2个回答
0
投票

这个表达式得到了你想要的结果:

regexp_replace(my_string, '(?<=:\d+)([a-zA-Z])', ', \1', 'g')

0
投票

您的正则表达式很好,尽管您可以通过使用

\d
代替
[0-9]
\w
代替
[a-z_A-Z]
来简化它。然后,您需要使用捕获组来保存匹配的文本并将其插入到替换字符串中:

SELECT REGEXP_REPLACE(my_string, '(:\d+)(\w)', '\1, \2', 'g')
FROM my_table

输出:

{ELEPHANT:1, FENNEC_FOX:1, NAKED_MOLE:1, URCHIN:2}
{DUNG_BEETLE:12, URCHIN:1}
{DUNG_BEETLE:1, FENNEC_FOX:1, URCHIN:2}

如果您尝试将其转换为有效的 JSON,则需要第二步将键括在双引号中:

SELECT REGEXP_REPLACE(REGEXP_REPLACE(my_string, '(:\d+)(\w)', '\1, \2', 'g'), '(\w+):', '"\1":', 'g')
FROM my_table

输出:

{ELEPHANT:1, FENNEC_FOX:1, NAKED_MOLE:1, URCHIN:2}
{DUNG_BEETLE:12, URCHIN:1}
{DUNG_BEETLE:1, FENNEC_FOX:1, URCHIN:2}

dbfiddle.uk

上进行演示
© www.soinside.com 2019 - 2024. All rights reserved.