在Oracle中使用正则表达式

正则表达式是一种强大的实用的字符串操作工具,可以用一定的字符及其组合逻辑进行灵活、强大的查找、匹配、替换等字符串操作。Oracle作为数据库行业执牛耳者,对正则表达式支持比较完善。

Oracle正则表达式函数

函数语法
REGEXP_LIKEREGEXP_LIKE(source_str,pattern,[match_parameter])
REGEXP_SUBSTRREGEXP_SUBSTR(source_str,pattern,[position],[occurrence],[match_parameter])
REGEXP_INSTRREGEXP_INSTR(source_str,pattern,[position],[occurrence],[return_option],[match_parameter])
REGEXP_REPLACEREGEXP_REPLACE(source_str,pattern,replace_str,[position],[occurrence],[match_parameter])
REGEXP_COUNTREGEXP_COUNT(source_str,pattern,[position],[match_parameter])
注:[]为可选项
参数含义
source_str输入的字符串,可以是列名或者字符串常量、变量。
pattern正则表达式。
match_parameter匹配选项。取值范围: i:大小写不敏感; c:大小写敏感;
n:点号 . 不匹配换行符号;
m:多行模式,开启则将^和$作为源串中的任何地方的任何行的分别的开始和结束,而不是仅在整个源串的开始或结束。如果省略此参数,则将源字符串视为单行。
x:扩展模式,忽略正则表达式中的空白字符。
position标识从第几个字符开始正则表达式匹配,默认为1
occurrence标识第几个匹配组。默认为1
replace_str替换的字符串,可以使用捕获组(\n调用,n为第n个捕获组)
return_option仅regexp_instr适用,0:默认值,返回pattern第一个字符出现的位置,1:pattern结束后下一个字符起始位置

regexp_like :只能放在where后作条件表达式,和 like 类似,但使用的正则表达式进行匹配;

regexp_substr 和 regexp_instr :分别对应Oracle的substr和instr ,分别进行字符拾取和定位,使用是正则表达式,更加简单灵活、强大;

regexp_replace :正则方式的替换,其中replace_str可以使用捕获组,\n形式调用

regexp_count :  11g开始新增的函数,可以统计一个字符串内出现pattern的次数

字符类

Oracle未使用\d,\w,\s等形式来表示字符类,而是采取以下POSIX字符类

[::] 指定一个字符类,可以匹配该类中的任何字符
[:alpha:]可以匹配字符A-Z、a-z
[:digit:]可以匹配数字0-9
[:alphanum:]可以匹配字符0-9、A-Z、a-z
[:lower:]可以匹配小写字母a-z
[:upper:]可以匹配大写字母A-Z
[:space:]可以匹配所有的空字符
[:blank:]可以匹配空格或tab键
[:graph:]可以匹配非空字符
[:print:]与[:graph:]类似,不同之处在于[:print:]包括空格字符
[:punct:]可以匹配标点符号.,””等等
[:xdigit:]可以匹配十六进制数字0-9、A-F、a-f

应用举例:

regexp_substr 

SELECT REGEXP_SUBSTR('http://www.abc_123.com/11/1.html?AD_SOURE=M2017-12-99-11-218','M201[5-9](-[0-9]+){3,4}') AD_SOURE
 FROM DUAL;
SELECT REGEXP_SUBSTR('http://www.abc_123.com/11/1.html?AD_SOURE=M2017-12-99-11-218','M201[5-9](-[0-9]+){3,4}','1','1','i') AD_SOURE
 FROM DUAL;
SELECT REGEXP_SUBSTR('http://www.abc_123.com/11/1.html?AD_SOURE=m2017-12-99-11-218','M201[5-9](-[[:digit:]]+){3,4}','1','1','i') AD_SOURE
 FROM DUAL;
-----
M2017-12-99-11-218
M2017-12-99-11-218
m2017-12-99-11-218

regexp_replace

SELECT REGEXP_REPLACE('13800054321','([[:digit:]]{3})([[:digit:]]{5})([[:digit:]]{3})','\1*****\3') 隐藏手机号
 FROM DUAL;
-------
138*****321

SELECT REGEXP_REPLACE('http://www.abc_123.com/11/1.html?AD_SOURE=M2017-12-99-11',
 'http://([[:alnum:]_\.]+)/.*',
 '\1')
 FROM DUAL;
-------
www.abc_123.com

SELECT REGEXP_REPLACE('正序:aa-bb-cc', '正序:(.+)-(.+)-(.+)', '逆序:\3-\2-\1') FROM DUAL;
-------
逆序:cc-bb-aa

尊重作者劳动,转载请注明出处:札记-Qianrong's Blog » 在Oracle中使用正则表达式

赞 (9)

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址