使用 regexp_replace 命令时遇到问题

Trouble using regexp_replace command

当前正在使用的命令:

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

这会将 "ovarian sertoli-leydig cell tumor" 更改为 "ovarian sertolileydig cell tumor"。它还会将 "hereditary breast/ovarian cancer (brca1, brca2)" 更改为 "hereditary breast ovarian cancer brca1 brca2"。

我不明白为什么要删除 "sertoli-leydig" 中的破折号并将其放入一个单词中,而不是在两者之间保留一个 space。在 regexp_replace 中,如果我在 'g' 之前的 ' ' 中放置一个 space,那么它还会在 "hereditary breast ovarian cancer brca1 brca2"[=12= 中放置一个双 space ]

我不需要双 space,我只想要一个 space。有什么想法可以在这里做什么吗?

I do not understand why it is removing the dash in the "sertoli-leydig" and putting it into one word instead of keeping a space in between.

因为那是你告诉它要做的。当你告诉它不要时,为什么它会在中间放一个 space?

用 space 替换标点符号,但捕获标点符号周围已有的任何 space,以便它们也被替换为单个 space。

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

你的RE(Table 9-19.正则表达式Class-shorthand转义)说要删除\w或\s中不包含的所有内容类。现在 \s 只是一个 space,而 \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;