我需要在字符串中替换多个单词(例如(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
答案 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 )
...