使用regexp_replace命令出现问题

时间:2019-11-02 18:35:02

标签: postgresql regexp-replace

当前使用的命令:

regexp_replace(b.DOWNCASE_NAME, '[^\w\s]', '', 'g') as CONDITION_NAME_DC

那将把“卵巢sertolileydig细胞瘤”变为“卵巢sertolileydig细胞瘤”。还将“遗传性乳腺癌/卵巢癌(brca1,brca2)”更改为“遗传性乳腺癌brca1 brca2”。

我不明白为什么要删除“ sertoli-leydig”中的破折号并将其放入一个单词而不是在两者之间留一个空格。在regexp_replace中,如果我在''之前的''之前加一个空格,那么它在“遗传性乳腺癌brca1 brca2”中也会加倍。

我不需要双倍空格,我只想要一个空格。任何想法在这里做什么?

2 个答案:

答案 0 :(得分:0)

  

我不明白为什么要删除“ sertoli-leydig”中的破折号并将其放入一个单词而不是在两者之间留一个空格。

因为那是您告诉它要做的。当您告诉您不要这样做时,为什么会在两者之间留一个空格?

用一个空格替换标点符号,但是捕获标点符号周围已经存在的所有空格,以便它们也被该单个空格替换。

regexp_replace(b.DOWNCASE_NAME, ' *[^\w\s] *', ' ', 'g');

答案 1 :(得分:0)

您的RE(表9-19。正则表达式类-速记转义符)表示删除\ w或\ s类中不包括的所有内容。现在\ s只是一个空格,\ w保留所有字母数字字符和下划线(_),因此您的RE既不保留破折号(-)也不保留(/)。展开RE来保留这些字符:

with b (downcase_name) as
  (values ('ovarian sertoli-leydig cell tumor')
        , ('hereditary breast/ovarian cancer (brca1, brca2)')
  )
select downcase_name, regexp_replace(b.downcase_name, '[^\w\s\-/]', '', 'g') as name_dc
  from b;