You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:02:47