Regexp_replace 返回无效号码

Invalid Number is returned by Regexp_replace

我想从名字中删除像 Dr., Mr. Jr. 这样的头衔。 Regexp_replace 应搜索并删除 Dr. Mr. Jr 并且搜索应不区分大小写,最终输出不应包含 ., 或名称中的额外空格。

select regexp_replace('DR. Mr. Mr Dr Radha Jr Jr. Krishnan Jr.','(Dr|Mr|Jr)(\W|\w|$|,)',1,0,'i') 
from dual

我收到无效号码错误。

您忘记了在 pattern 和 1 之间替换什么

select regexp_replace('DR. Mr. Mr Dr Radha Jr Jr. Krishnan Jr.','(Dr|Mr|Jr)(\W|\w|$|,)','',1,0,'i') 
from dual

以下查询将删除多个空 space 和 trim 前导 space:

SELECT TRIM(REGEXP_REPLACE(
         REGEXP_REPLACE('DR. Mr. Mr Dr Radha Jr Jr. Krishnan Jr.', '(Dr|Mr|Jr)(\W|\w|$|,)', '', 1, 0, 'i')
       , ' {2,}', ' ')) AS "Result"
FROM Dual

它会return结果为Radha Krishnan

Demo on db<>fiddle

您的解决方案缺少两个方面。

更重要的是,您可以从名称中删除前导 "titles":

select regexp_replace('DR. Mr. Mr Dr Dradha Jr Jr. Mrishnan Jr.','(Dr|Mr|Jr)(\W|\w|$|,)','',1,0,'i') 
from dual

哪个returns不是预期的结果

dha  shnan 

补救方法是只允许非单词字符\W)和行尾($之后标题.

如果在标题 之前强制执行可选 space 或行首 (^) ,则可以解决第二个问题 [=删除标题后还剩 34=]s

select regexp_replace('DR. Mr. Mr Dr Dradha Jr Jr. Mr, Mrishnan Jr.',
  '( *|^)(Dr|Mr|Jr)(\W|$)','',1,0,'i') 
from dual

Dradha Mrishnan