Oracle 中的正则表达式函数:
1)
REGEXP_LIKE(x,pattern[,match_option])用于在x中查找正则表达式pattern,该函数还可以提供一个可选的参数match_option字符串说明默认的匹配选项。match_option的取值如下:
'c' 说明在进行匹配时区分大小写(缺省值);
'i' 说明在进行匹配时不区分大小写;
'n' 允许使用可以匹配任意字符的操作符;
'm' 将x作为一个包含多行的字符串。
for example:
SQL> select 1 from dual where REGEXP_LIKE('7:30 a.m','[[:digit:]]+');
1
----------
1
2)
REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[, match_option]]]])用于在x中查找pattern。返回pattern在x中出现的位置。
'start' 开始查找的位置;
'occurrence' 说明应该返回第几次出现pattern的位置;
'eturn_option' 说明应该返回什么整数。若该参数为0,则说明要返回的整数是x中的一个字符的位置;若该参数为非0的整数,
则说明要返回的整数为x中出现在pattern之后的字符的位置;
for example:
SQL> select REGEXP_INSTR('7:30 a.m','[[:digit:]]+',1,2) from dual;
REGEXP_INSTR('7:30A.M','[[:DIGIT:]]+',1,2)
------------------------------------------
3
SQL> select REGEXP_INSTR('7:30 a.m','[[:digit:]]+',1,1) from dual;
REGEXP_INSTR('7:30A.M','[[:DIGIT:]]+',1,1)
------------------------------------------
1
3)
REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[, match_option]]]])用于在x中查找pattern,并将其替换为replae_string
for example:
SQL> select REGEXP_REPLACE('7:30 a.m','[[:digit:]]+','40',1,2) from dual;
REGEXP_REPLACE('7:30A.M','[[:DIGIT:]]+','40',1,2)
--------------------------------------------------------------------------------
7:40 a.m
4)
REGEXP_SUBSTR(x,pattern[,start[,occurrence[, match_option]]])用于在x中查找pattern并返回。可以参考字符串函数 SUBSTR(),参数同REGEXP_INSTR函数
for example
SQL> select NVL(REGEXP_SUBSTR('12:30 a.m','[[:digit:]]+',1,2),'00') from dual;
NVL(REGEXP_SUBSTR('12:30A.M','[[
--------------------------------
30
[[:alpha:]] 任何字母。
[[:digit:]] 任何数字。
[[:alnum:]] 任何字母和数字。
[[:space:]] 任何白字符。
[[:upper:]] 任何大写字母。
[[:lower:]] 任何小写字母。
[[:punct:]] 任何标点符号。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。
一个小例子:
select
CASE WHEN REGEXP_LIKE('7:30 a.m','[[:digit:]]+') THEN
CASE
WHEN REGEXP_SUBSTR('7:30 a.m','[[:digit:]]+') <= 12 THEN
TO_CHAR(TO_DATE(REGEXP_SUBSTR('7:30 a.m','[[:digit:]]+') || ':' || NVL(REGEXP_SUBSTR('7:30 a.m','[[:digit:]]+',1,2),'00') ||
CASE WHEN lower('7:30 a.m') like '%p%' THEN ' PM' ELSE ' AM' END, 'HH:MI PM'), 'HH24MISS')
ELSE
REGEXP_SUBSTR('7:30 a.m','[[:digit:]]+') || NVL(REGEXP_SUBSTR('7:30 a.m','[[:digit:]]+',1,2),'00') || '00'
END
ELSE '000000'
END AS DD
from dual;