【问题标题】:Invalid Number is returned by Regexp_replaceRegexp_replace 返回无效数字
【发布时间】:2019-10-24 12:44:04
【问题描述】:

我想从名称中删除诸如 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

我收到无效号码错误。

【问题讨论】:

  • 您的实际预期输出是多少?

标签: sql oracle regexp-replace


【解决方案1】:

你忘了在模式和 1 之间用什么替换

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

【讨论】:

  • 哦!.. 谢谢,但我在输出中得到了额外的空格。 select length(regexp_replace('DR. Mr. Mr. Mr Dr Dr Radha Jr. Krishnan Jr.','(Dr|Mr|Jr)(\W|\w|$|,)','',1,0,' i')) 来自双重
  • @MKS 这不是问题的一部分
【解决方案2】:

以下查询将删除多个空格并修剪前导空格:

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

它将返回结果为Radha Krishnan

Demo on db<>fiddle

【讨论】:

  • @MKS 您不能接受多个答案。在满足您预期结果的答案中,您只能为您的问题选择一个接受的答案。
【解决方案3】:

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

更重要的是你可以从名字中去掉前面的“标题”:

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

返回非预期结果

dha  shnan 

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

如果您强制使用可选空格或行首 (^)在标题之前,您就可以摆脱第二个问题,即删除标题后留下的空格

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

Dradha Mrishnan  

【讨论】:

    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    相关资源
    最近更新 更多