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
相关产品推荐
相关产品推荐

