我不是正则表达式的Maven,寻求帮助。提前感谢
我想从描述列中提取一个格式化的子字符串。
从
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.
TO
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
我的查询适用于第一条和最后一条记录。但是,有标题的记录有点复杂。
对于有标题的记录,我需要保留标题、名字和姓氏的首字母。
SELECT description,
CASE
WHEN REGEXP_LIKE(description, '(Mr\.|Ms\.|Mrs\.|Dr\.)') THEN REGEXP_REPLACE(description, '(Ms\.|Mr\.|Mrs\.|Dr\.[A-Z][a-z]+ [A-Z]\.)')
WHEN NOT REGEXP_LIKE(description, '(Mr\.|Ms\.|Mrs\.|Dr\.)') THEN REGEXP_REPLACE(description, '(\w)\w*\W+(\w)\w*\W+(\w+),.*', '\1. \3')
ELSE 'some other validation needed'
END AS order_regex
from mytable;
再次感谢您的任何建议。
2条答案
按热度按时间dphi5xsq1#
我会这样做:
此正则表达式的简短说明:
([^-]+)-
-查找以-
结尾的子字符串的第一部分(子表达式#1)\s*
-任意数量的空格字符((Mr|Ms|Mrs|Dr)[.]\s*)?
-检查Mr.|女士|夫人|Dr.存在并作为子表达式#2返回(\w)\w*
-查找一个名称并返回第一个字母作为子表达式$3(\s[a-zA-Z.]*)*
-名字和姓氏之间的任意数量的单词(子表达式#4)\s(\w+)(,.*|$)
-查找姓氏(即','之前的最后一个单词或字符串的结尾)并作为子表达式#5返回。完整测试用例:
DBFiddle:https://dbfiddle.uk/HNHHzGR4
p8h8hvxi2#
对于这个确切的例子,你可以使用这样的东西:
编辑:对多部分名称更通用一些:
演示herev2
但是一般来说,名称很难解析,我担心简单的正则表达式集不起作用。