regex_replace在替换文本中使用模式

时间:2019-01-11 21:15:59

标签: regex postgresql replace

是否可以在替换文本的regex_replace中使用模式?我正在尝试在名称之间插入空格。

例如,以Johnny SmithSarah Suzanne(D)Johnny SmithSarah Suzanne(D)为例,我试图使输出为 Johnny Smith Sarah Suzanne(D) Johnny Smith Sarah Suzanne(D)

我尝试过这样的事情:

SELECT 
    'Johnny SmithSarah Suzanne(D)Johnny SmithSarah Suzanne(D)'
    , regexp_replace('Johnny SmithSarah Suzanne(D)Johnny SmithSarah Suzanne(D)', '[a-z)][A-Z]',' ', 'g');

我意识到我的模式从...开始是错误的(仍然试图弄清楚),但是在我继续之前,它甚至可能吗?有人可以指导我如何做吗?

2 个答案:

答案 0 :(得分:1)

您似乎正在寻找捕获组。

SELECT 'Johnny SmithSarah Suzanne(D)Johnny SmithSarah Suzanne(D)',
        regexp_replace('Johnny SmithSarah Suzanne(D)Johnny SmithSarah Suzanne(D)', '([a-z)])([A-Z])','\1 \2', 'g')

如果在模式中用括号括起来的部分(在(之后没有任何特殊字符,这会更改组的含义),则将捕获与模式的该部分匹配的字符串。使用“ \”,您可以在替换表达式中引用这些捕获的字符串,并将匹配的字符串放置在此处。 n是捕获组的编号,从左到右,嵌套时子级在父级之前。

答案 1 :(得分:0)

我可能对此进行了简化,但是您不能仅将')'字符替换为')'吗?

select regexp_replace ('Johnny Smith(D)Johnny Smith(D)', '\)', ') ', 'g')

如果您担心在末尾添加多余的空格,可以随时将其更改为仅在')'后跟一个字符集(例如字字符下方)时使用:

select regexp_replace ('Johnny Smith(D)Johnny Smith(D)', '\)(\w)', ') \1', 'g')