使用
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