使用Oracle REGEXP_SUBSTR提取字符串中的天数数字问题
解决Oracle中提取天数数字的正则问题
问题分析
你当前的正则表达式REGEXP_SUBSTR(str,'[(0-9)]+[?=Days]')存在两个关键错误:
[(0-9)]是错误的字符集定义,它会匹配括号(、)和数字,正确的数字匹配应该用[0-9]+或\d+(Oracle中\d等价于[0-9])。[?=Days]把正向预查的语法用错了,方括号会将?=视为普通字符,最终匹配数字后的第一个D,导致结果带上D。
正确解决方案
方案1:使用正向预查(Oracle 11g及以上支持)
修正正则表达式,利用正向预查确保数字后紧跟Days或Day,但不包含这些字符在匹配结果中:
REGEXP_SUBSTR(str, '[0-9]+(?=Days|Day)')
- 测试示例:
- 输入
FR_OTC 0 THB Local 10GB 10400601 15Days T2T→ 返回15 - 输入
FR_OTC 0 THB Local 10GB 1Day T2T→ 返回1
- 输入
方案2:兼容低版本Oracle(如10g及以前)
如果你的Oracle版本不支持正向预查,可以先用正则匹配数字+Days/Day的组合,再通过替换提取数字部分:
REGEXP_REPLACE(str, '.*([0-9]+)(Days|Day).*', '\1')
- 原理:通过捕获组
\1提取数字部分,将整个字符串替换为捕获到的数字。
内容的提问来源于stack exchange,提问作者Govind Shah
相关产品推荐
相关产品推荐

