1. 程式人生 > >Oracle正則表示式操作樣例

Oracle正則表示式操作樣例

資料處理過程中,對於質量不高的輸入資料,經常要做一些清洗操作。如果不懂正則表示式,那是非常痛苦的事情。

正則表示式還是比較繁雜的,很容易被它的語法繞暈,想要精通更不容易,一般都是用到了去查,去試。
這裡有一篇開發人員整理的常用清單,可以參考一下:
最全的常用正則表示式大全——包括校驗數字、字元、一些特殊的需求等等

在Oracle中,提供了REGEXP_開頭的正則表示式函式,包括REGEXP_REPLACE、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_LIKE、REGEXP_COUNT等5個函式。自己也只學了個皮毛,把常用的幾個操作記錄一下:

一、用regexp_replace做文字過濾

1.保留英文字元

SQL> select regexp_replace('SQL開發手冊(one):99.98元/冊','[^a-zA-Z]','') from dual;
REGEXP_REPLACE('SQL開發手冊(ON
--------------------------
SQLone

2.保留數字(含小數點)

SQL> select regexp_replace('SQL開發手冊(one):99.98元/冊','[^0-9.]','') from dual;
REGEXP_REPLACE('SQL開發手冊(ON
--------------------------
99.98

3.保留漢字和英文

SQL> select regexp_replace('SQL開發手冊(one):99.98元/冊','[^[:alpha:]]','') from dual;
REGEXP_REPLACE('SQL開發手冊(ON
--------------------------
SQL開發手冊one元冊

這裡[:alpha:]是POSIX組織定義的字元組合類,oracle支援一下12個組合
[:alnum:]、[:cntrl:]、[:lower:]、[:space:]、[:alpha:]、[:digit:]、[:print:]、[:upper:]、[:blank:]、[:graph:]、[:punct:]、[:xdigit:]
具體包括哪些字元,可以參照POSIX的解釋:

POSIX Class

二、一個正則表示式樣例的解釋

SQL> select regexp_replace('1001-ad3Df38Fd,1002-6fG3Hdg,1003-Ku45SdGf78','([0-9]*)-([0-9a-zA-Z]*),?','\1(\2)'||chr(10))
  2    from dual;
REGEXP_REPLACE('1001-AD3DF38FD
-----------------------------------------------
1001(ad3Df38Fd)
1002(6fG3Hdg)
1003(Ku45SdGf78)

上面的SQL中,把原來的字串(’1001-ad3Df38Fd,1002-6fG3Hdg,1003-Ku45SdGf78’)根據逗號(,)分解成3個部分,每個部分將原來的2個元素用減號(-)分隔的格式改成了用括號將第二個元素包括。

SQL中使用的正則表示式’([0-9])-([0-9a-zA-Z]),?’去匹配原字串,然後替換成’\1(\2)’||chr(10)的表示式,可以這麼解析:

([0-9]*)

表示有若干個數字,匹配1001,用括號是為了後面替換

-

減號

([0-9a-zA-Z]*)

有數字或英文字元若干個,匹配ad3Df38Fd,用括號是為了後面替換

,?

有0個或1個逗號,主要是匹配最後一段不是以逗號結尾。
以上是匹配的表示式,下面是替換用的表示式

\1

第一對()中的內容([0-9]*),匹配1001

(\2)

第二對()中的內容([0-9a-zA-Z]*),匹配ad3Df38Fd,用()進行包括。

chr(10)

換行