【发布时间】:2015-12-03 04:35:24
【问题描述】:
我想从 var-char 字段中获取固定长度的数字。假设我有一个像 text1234567890fortex23466666sortes1234567890123 这样的字符串,那么我想获取哪个数字在字符之间连续固定 10 位数字,即 1234567890 并且我的数据也像 @ 987654323@ 那么输出应该是 0987654321
【问题讨论】:
我想从 var-char 字段中获取固定长度的数字。假设我有一个像 text1234567890fortex23466666sortes1234567890123 这样的字符串,那么我想获取哪个数字在字符之间连续固定 10 位数字,即 1234567890 并且我的数据也像 @ 987654323@ 那么输出应该是 0987654321
【问题讨论】:
使用
Select regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) from dual;
提取第一次出现的最大 10 位数字。您必须对结果进行后处理以删除封闭的非数字。重复基于正则表达式的提取的完整解决方案是:
Select regexp_substr (
regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' )
, '[0-9]{10}'
)
from dual
;
或者,按案例分解预处理:
Select case length(i.interim)
When 10 then i.interim
When 12 then substr(i.interim, 2, 10 )
Else case when regexp_instr(i.interim, '[0-9]') = 1
Then substr ( i.interim, 1, 10 )
Else substr ( i.interim, 2 )
End
End
From (
Select regexp_substr ( <text>, '(^|[^0-9])[0-9]{10}([^0-9]|$)' ) interim from dual
) i
;
如果你想避免多次调用正则表达式函数,你需要求助于regexp_replace:
Select regexp_replace( <text>, '^(.*[^0-9])?([0-9]{10})([^0-9].*)?$', '\2' ) from dual;
注意
在 12c 中,regexp_substr 补充了一个新参数,以返回一个完整匹配的捕获组:
Select regexp_substr ( <text>, '(^|[^0-9])([0-9]{10})([^0-9]|$)', 1, 1, '', 2 ) from dual;
最后一个参数表示捕获组,中间的参数分别表示匹配、出现和匹配参数的开始位置;详情请见the oracle docs。
【讨论】: