Oracle-12c

正則表達式替換以在開頭忽略某些模式(如果存在)並格式化其餘部分

  • September 18, 2021

如果存在,如何使用正則表達式替換忽略國家程式碼,我嘗試使用

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'
)

小提琴

引用自:https://dba.stackexchange.com/questions/299703