正则表达式是一种强大的实用的字符串操作工具,可以用一定的字符及其组合逻辑进行灵活、强大的查找、匹配、替换等字符串操作。Oracle作为数据库行业执牛耳者,对正则表达式支持比较完善。
Oracle正则表达式函数
函数 | 语法 |
---|---|
REGEXP_LIKE | REGEXP_LIKE(source_str,pattern,[match_parameter]) |
REGEXP_SUBSTR | REGEXP_SUBSTR(source_str,pattern,[position],[occurrence],[match_parameter]) |
REGEXP_INSTR | REGEXP_INSTR(source_str,pattern,[position],[occurrence],[return_option],[match_parameter]) |
REGEXP_REPLACE | REGEXP_REPLACE(source_str,pattern,replace_str,[position],[occurrence],[match_parameter]) |
REGEXP_COUNT | REGEXP_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中使用正则表达式