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)

换行

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值