Oracle-12c
正則表達式替換以在開頭忽略某些模式(如果存在)並格式化其餘部分
如果存在,如何使用正則表達式替換忽略國家程式碼,我嘗試使用
select REGEXP_REPLACE(phone_number,'^/(?:011.44.)([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})$', '\1-\2-\3') regex_output from employees;
但它不起作用,下一個適用於格式
515.123.4567
'([[:digit:]]{3})\.([[:digit:]]{3})\.([[:digit:]]{4})$'
但他們有一些電話號碼
011.44.1345.729268
,如果可能的話,我想忽略 011.44 如果存在於數字的開頭,使用一種正則表達式語法。這應該是忽略語法,但它不起作用,
^/(?:011.44.)
或者^/(?!011.44.)
我也^/(?!([[:digit:]]{3})\.([[:digit:]]{2})\.)
再次嘗試不起作用注意我可以使用其他函式來做到這一點,這個問題僅與正則表達式有關,我正在使用 oracle HR 數據庫-------------------------------------------------- | original numbers | expected output | -------------------------------------------------- | phone_number | regex_output | -------------------------------------------------- | 515.123.4567 | 515-123-4567 | | 515.123.4567 | 515-123-4567 | | 515.123.4567 | 515-123-4567 | | 515.123.4567 | 515-123-4567 | | 011.44.1345.729268 | 134-572-9268 | | 011.44.1345.729268 | 134-572-9268 | | 011.44.1345.729268 | 134-572-9268 | | 011.44.1345.729268 | 134-572-9268 | --------------------------------------------------
更新:
如果其他人想知道我發現在 oracle中不支持非擷取組
(?:…),非擷取組,不支持,您應該將它們替換為擷取組。(請注意, (:? 不是非擷取組,它只是模式中第二個擷取組開頭的可選冒號)。 – Wiktor Stribiżew
我建議您在應用正則表達式之前對字元串進行規範化:
REGEXP_REPLACE( REPLACE(phone_number, '.'), '^(01144)?([[:digit:]]{3})([[:digit:]]{3})([[:digit:]]{4})$', '\2-\3-\4' )