使用 regexp_replace 命令时遇到问题
Posted
技术标签:
【中文标题】使用 regexp_replace 命令时遇到问题【英文标题】:Trouble using regexp_replace command 【发布时间】:2020-02-28 15:06:09 【问题描述】:当前正在使用的命令:
regexp_replace(b.DOWNCASE_NAME, '[^\w\s]', '', 'g') as CONDITION_NAME_DC
这会将“卵巢支持细胞瘤”改为“卵巢支持细胞瘤”。它还将“遗传性乳腺癌/卵巢癌(brca1,brca2)”更改为“遗传性乳腺癌卵巢癌brca1 brca2”。
我不明白为什么它要删除“sertoli-leydig”中的破折号并将其放入一个单词中,而不是在两者之间保留一个空格。在 regexp_replace 中,如果我在 'g' 之前的 ' ' 中放置一个空格,那么它也会在“遗传性乳腺癌卵巢癌 brca1 brca2”中放置一个双空格
我不需要双倍空间,我只想要一个空间。有什么想法可以在这里做什么吗?
【问题讨论】:
它将“遗传性乳腺癌/卵巢癌 (brca1, brca2)”转换为“遗传性乳腺癌/卵巢癌 brca1 brca2”。请注意缺少空格。也许您的原件有一个空格和一个斜线? 【参考方案1】:我不明白为什么它会删除“sertoli-leydig”中的破折号并将其放入一个单词中,而不是在两者之间保留一个空格。
因为那是你告诉它去做的。当你告诉它不要时,它为什么要在两者之间留一个空格?
用空格替换标点,但捕获标点周围已经存在的任何空格,以便它们也被该单个空格替换。
regexp_replace(b.DOWNCASE_NAME, ' *[^\w\s] *', ' ', 'g');
【讨论】:
天哪,你是救生员!非常感谢您的帮助,这很完美。在我的一生中,我无法理解这个 regexp_replace 命令,我花了数周时间试图弄清楚如何让东西在其中工作。再次感谢! @Preet 我认为部分问题是您没有正确看到函数的输入是什么。我不知道您使用的是什么工具,但也许您需要将其更改为使用固定宽度的字体,以便输入上的空格显示得更清楚。【参考方案2】:您的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;
【讨论】:
以上是关于使用 regexp_replace 命令时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章
regexp_replace 和 regexp_substr 变量的比较
为啥在使用 regexp_replace 时每个字符前后都有空格?