使用
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
已经补充了新的参数,返回一个捕获组instaed完全吻合的:
Select regexp_substr (<text>, '(^|[^0-9])([0-9]{10})([^0-9]|$)', 1, 1, '', 2) from dual;
最后一个参数表示捕获组,中间的参数表示的比赛开始的位置,发生,匹配参数,resp .;详细信息请参见the oracle docs。
谢谢,你的第一个解决方案工作正常,但不是使用REGEXP_SUBSTR两次,它可能通过使用单个REGEXP_SUBSTR获得相同的结果 – user1463065
在11g2中,regexp_substr只能提取整个匹配。这将包括任何周围的非数字。 Afaik Oracle的正则表达式语法不支持lookaround语法。 12c为regexp_substr引入了一个新参数,该参数指定要返回的捕获组而不是完整匹配。或者,使用regexp_replace(调整模式以匹配完整的字符串)。我会相应地补充我的答案。 – collapsar
我们只使用oracle12c。您能否使用12c中的单个REGEXP_SUBSTR提供相同的功能 – user1463065