如何更换多个单词"全球"在Oracle中使用regexp_replace?

时间:2018-02-26 13:26:05

标签: regex oracle11g

我需要在字符串中替换多个单词(例如(dog | cat | bird)),其中可能有多个连续出现的单词。实际代码是从名称中删除称呼和后缀。不幸的是,我得到的垃圾数据有时包含" SNERD JR JR。"

我能够创建一个正则表达式模式来完成我的目标,但仅限于第一次出现。我实施了一个愚蠢的黑客来摆脱第二次发生,但我相信必须有一个更好的方法。我无法弄清楚。

这是我的"黑客攻击"代码;

  FUNCTION REMOVE_SALUTATIONS(IN_STRING VARCHAR2) RETURN VARCHAR2 DETERMINISTIC
  AS
    REGEX_SALUTATIONS VARCHAR2(4000) := '(^|\s)(MR|MS|MISS|MRS|DR|MD|M D|SR|SIR|PHD|P H D|II|III|IV|JR)(\.?)(\s|$)';
  BEGIN
    RETURN TRIM(REGEXP_REPLACE(REGEXP_REPLACE(IN_STRING,REGEX_SALUTATIONS,' '),REGEX_SALUTATIONS,''));
  END REMOVE_SALUTATIONS;

我真的很自豪我能够做到这一点,因为正则表达对我来说不是很规律。感谢所有帮助。

编辑:

根据我的理解,regexp_replace的默认值是进行全局替换。但在外部机会我的数据库配置不同我尝试了;

select REGEXP_REPLACE('SNERD JR JR','(^|\s)(MR|MS|MISS|MRS|DR|MD|M D|SR|SIR|PHD|P H D|II|III|IV|JR)(\.?)(\s|$)',' ',1,0) from dual;

,结果是;

SNERD JR

1 个答案:

答案 0 :(得分:-1)

使用occurrence功能的REGEXP_REPLACE参数。文档说:

  

occurrence是一个非负整数,表示替换操作的发生:

     
      
  • 如果指定0,则Oracle将替换所有匹配项。
  •   
  • 如果指定正整数n,则Oracle将替换第n个occurrenc
  •   

https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions137.htm#SQLRF06302

应该看起来像:

...
REGEXP_REPLACE(IN_STRING,REGEX_SALUTATIONS,' ', 1,0 )
...