数据处理过程中,对于质量不高的输入数据,经常要做一些清洗操作。如果不懂正则表达式,那是非常痛苦的事情。
正则表达式还是比较繁杂的,很容易被它的语法绕晕,想要精通更不容易,一般都是用到了去查,去试。
这里有一篇开发人员整理的常用清单,可以参考一下:
最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
在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)
换行