下面通过一些例子来说明使用正则表达式来处理一些工作中常见的问题。
1.
REGEXP_SUBSTR
REGEXP_SUBSTR 函数使用正则表达式来指定返回串的起点和终点,返回与source_string 字符集中的VARCHAR2 或CLOB 数据相同的字符串。
语法:
--1.REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串
REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]])
注:
srcstr
源字符串
pattern
正则表达式样式
position
开始匹配字符位置
occurrence
匹配出现次数
match_option
匹配选项(区分大小写)
1.1从字符串中截取子字符串
SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual;
Output: 1PSN
[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符。
SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual;
Output: 231
与上面一个例子相比,多了两个参数
1
表示从源字符串的第一个字符开始查找匹配
2
表示第2次匹配到的字符串(默认值是“1”,如上例)
select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual;
Output: 231
@* 表示匹配0个或者多个@
[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符
注意:需要注意“+”和“*”的区别
select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual;
Output: @
@+ 表示匹配1个或者多个@
[[:alnum:]]* 表示匹配0个或者多个字母或数字字符
select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;
Output: Null
@+ 表示匹配1个或者多个@
[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符
select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;
Output: 125
[[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符
select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from dual;
Output: /ABc
[^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符
select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from dual;
Output: Tom_Kyte
[^@]+ 表示匹配1个或者多个不是“@”的字符
select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2)
from dual;
Output: Null
[[:alnum:]]* 表示匹配0个或者多个字母或者数字字符