PL/SQL中REGEXP_SUBSTR起始位置问题:提取拼接字符串中的姓名
解决Oracle中提取数字后姓名的正则表达式问题
让我来帮你搞定这个问题!首先得指出你代码里的核心错误:REGEXP_SUBSTR的第四个参数(出现次数)必须是正整数,你传入的'\d+\w'是字符串,Oracle尝试把它转换成数字时就抛出了ORA-01722(无效数字)错误,进而引发ORA-12801的错误提示。
你的需求是提取每行拼接后字符串里数字后面的姓名(可能是单/多个单词),我们可以通过两种更合适的正则方法来实现:
方法1:用REGEXP_REPLACE移除前面不需要的内容
这种方法最简单直接——把数字及之前的所有内容替换为空,剩下的就是姓名:
SELECT REGEXP_REPLACE( -- 注意拼接列时要加空格,避免不同列的字符串连在一起无法区分 CONCAT(e.column1, ' ', e.column2, ' ', e.column3), '^.*\d+\s+' -- 匹配从开头到最后一个数字+后续空格的所有内容 ) AS full_name FROM exampletable e;
正则说明:
^.*:匹配字符串开头到任意位置的所有字符\d+:匹配一个或多个数字\s+:匹配数字后面的一个或多个空格- 整体替换为空后,剩下的就是数字之后的姓名部分
方法2:用REGEXP_SUBSTR的捕获组提取
如果你更倾向于用REGEXP_SUBSTR,可以利用它的捕获组功能,直接提取数字后的内容:
SELECT REGEXP_SUBSTR( CONCAT(e.column1, ' ', e.column2, ' ', e.column3), '.*\d+\s+(.*)', -- 捕获数字空格后的所有内容 1, 1, 'i', 1 -- 最后一个参数1表示取第一个捕获组的内容 ) AS full_name FROM exampletable e;
参数说明:
- 第5个参数
'i'是可选的,表示不区分大小写(如果你的姓名不需要区分大小写可以去掉) - 第6个参数
1指定提取正则表达式中第一个捕获组(.*)的内容,也就是数字空格后的所有字符
这两种方法都能正确处理你给出的示例输入,输出你想要的Walter Davis、Nathan Johns、Emily Grand这类姓名结果。
内容的提问来源于stack exchange,提问作者Looz
相关产品推荐
相关产品推荐

