Oracle SQL Developer正则表达式求助:格式化提取描述列姓名子串
正则表达式优化方案
原始数据
my testing on 456897 - Carol M. Smith, Ph.D. my testing on 435670 - Ms. Paulina M. Hall my testing on 980765 - Mr. John Smith my testing on 14567 - Mrs. Lena C. Callum my testing on 555777 - Dr. Paul F. Fairlake 234567 - Mr. Ryan M. Palmer, Sr. 123456 - Joyce R. Hilton, Ph.D.
期望格式化结果
my testing on 456897 - C.Smith my testing on 435670 - Ms. P. Hall my testing on 980765 - Mr. J. Smith my testing on 14567 - Mrs. L. Callum my testing on 555777 - Dr. P. Fairlake 234567 - Mr. R. Palmer 123456 - J. Hilton
优化后的SQL查询
SELECT description, REGEXP_REPLACE( description, '^(.* - )(?:(Mr\.|Ms\.|Mrs\.|Dr\.) )?([A-Z])[a-z]+(?: [A-Z]\.)? ([A-Za-z]+)(?:, .*)?$', '\1\2 \3. \4' ) AS order_regex FROM mytable;
正则逻辑说明
^(.* - ):匹配并保留开头到-的所有前缀内容,比如my testing on 456897 -或234567 -(?:(Mr\.|Ms\.|Mrs\.|Dr\.) )?:可选匹配头衔(非捕获组加?表示该部分可存在可不存在),若存在则捕获头衔文本([A-Z])[a-z]+:捕获名字的首字母,忽略首字母后的小写名字部分(?: [A-Z]\.)?:可选匹配中间名缩写(如M.),不捕获该部分([A-Za-z]+):捕获完整姓氏(?:, .*)?$:忽略姓氏后的所有后缀内容(如, Ph.D.、, Sr.)
这个正则可以一次性处理所有场景,无需分CASE判断,自动适配有无头衔、有无中间名、有无后缀的记录。
内容的提问来源于stack exchange,提问作者juniorR
相关产品推荐
相关产品推荐

