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

Amazon Redshift中POSIX重复量词{}无法正常工作问题

解决Oracle REGEXP_SUBSTR中量词{}替换*后返回NULL的问题

我完全懂你遇到的困扰——用*量词时正则能正常揪出目标字符串,换成{}就直接返回NULL,这其实是因为你可能没搞清楚{}量词的语法规则。

核心问题:{}不能单独用

在Oracle的正则语法里,*是{0,}的简写,意思是匹配前面的元素0次或多次;但{}可不是随便写的,必须明确指定次数范围:

  • {n}:精准匹配n次
  • {n,}:匹配n次及以上
  • {n,m}:匹配n到m次

要是你直接把*换成空的{}(比如写成[0-9]{}),这属于语法错误,Oracle根本认不出这个正则模式,自然返回NULL。

正确的替换写法

要等价替换原来的*,你得把[0-9]*改成[0-9]{0,},完整的SQL语句应该是这样:

select regexp_substr('2018-09-90 88:88:90:900 -0900','([0-9]{0,}-[0-9]{0,}-[0-9]{0,} [0-9]{0,}:[0-9]{0,}:[0-9]{0,}:[0-9]{0,} (\+|-)[0-9]{0,})') from dual;

不过看你的目标字符串,每个数字段都是至少有1位的(比如年份4位、月份2位),其实更严谨的写法是用{1,}(等价于+)来匹配1次及多次,避免匹配空的数字段:

select regexp_substr('2018-09-90 88:88:90:900 -0900','([0-9]{1,}-[0-9]{1,}-[0-9]{1,} [0-9]{1,}:[0-9]{1,}:[0-9]{1,}:[0-9]{1,} (\+|-)[0-9]{1,})') from dual;

额外优化提示

如果你的目标是匹配这类带时区的时间戳,还能把正则写得更精准,比如年份固定4位、毫秒最多3位:

select regexp_substr('2018-09-90 88:88:90:900 -0900','([0-9]{4}-[0-9]{1,2}-[0-9]{1,2} [0-9]{1,2}:[0-9]{1,2}:[0-9]{1,2}:[0-9]{1,3} (\+|-)[0-9]{4})') from dual;

内容的提问来源于stack exchange,提问作者Isha Garg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:59:21