oracle的正则表达式,

根据定义的规律进行数据的检索、添加、删除、分析、叠加、插入和修整。

Oracle使用正则表达式离不开这4个函数:

1。regexp_like

2。regexp_substr

3。regexp_instr

4。regexp_replace

看函数名称大概就能猜到有什么用了。

1.regexp_like 只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配,

语法很简单:

regexp_like(source_char,pattern,match_parameter)

2.regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,

语法如下:

regexp_substr(source_char,pattern,position,occurrence,match_parameter)

3.regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的开始位置,

语法如下:

regexp_instr(source_char,pattern,position,occurrence,return_option,match_parameter)

4.regexp_replace 函数,和 replace 类似,用于替换符合正则表达式的字符串,

语法如下:

regexp_replace(source_char,pattern,replace_string,position,occurrence,match_parameter)

这里解析一下几个参数的含义:

1。source_char,输入的字符串源,

2。pattern,正则表达式。

3。match_parameter,匹配选项。

        取值范围: i:大小写不敏感; c:大小写敏感;n:点号 . 不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。

4。position,标识从第几个字符开始正则表达式匹配。可选。搜索在字符串中的开始位置。如果省略,默认为1,这是第一个位置的字符串。

5。occurrence,标识第几个匹配组。可选。它是模式字符串中的第n个匹配位置。如果省略,默认为1。

6。replace_string,替换的字符串。

描述
1.^ 匹配一个字符串的开始。如果与“m” 的match_parameter一起使用,则匹配表达式中任何位置的行的开头。
2.$ 匹配字符串的结尾。如果与“m” 的match_parameter一起使用,则匹配表达式中任何位置的行的末尾。
3.* 匹配零个或多个。
4.+ 匹配一个或多个出现。
5.? 匹配零次或一次出现。
6.。 匹配任何字符,除了空。
7.| 用“OR”来指定多个选项。
8.[] 用于指定一个匹配列表,您尝试匹配列表中的任何一个字符。
9.[^] 用于指定一个不匹配的列表,您尝试匹配除列表中的字符以外的任何字符。
10.() 用于将表达式分组为一个子表达式。
11.{M} 匹配m次。
12.{M,} 至少匹配m次。
13.{M,N} 至少匹配m次,但不多于n次。
14. n n是1到9之间的数字。在遇到 n之前匹配在()内找到的第n个子表达式。
15.[..] 匹配一个可以多于一个字符的整理元素。
15.[:] 匹配字符类。
16.[==] 匹配等价类。
17. d 匹配一个数字字符。
18. D 匹配一个非数字字符。
19. w 匹配包括下划线的任何单词字符。
20. W 匹配任何非单词字符。
21. s 匹配任何空白字符,包括空格,制表符,换页符等等。
22. S 匹配任何非空白字符。
23.A 在换行符之前匹配字符串的开头或匹配字符串的末尾。
24. 匹配字符串的末尾。
25.*? 匹配前面的模式零次或多次发生。
26.+? 匹配前面的模式一个或多个事件。
27.?? 匹配前面的模式零次或一次出现。
28.{N}? 匹配前面的模式n次。
29.{N,}? 匹配前面的模式至少n次。
30.{N,M}? 匹配前面的模式至少n次,但不超过m次。

说了一堆文绉绉的,现在开始实例演练了。

 
select * from tmp ;
ID             STR
-------     -------------
like        a9999
like        a9c
like        A7007
like        123a34cc
like aa
like 2b3
like b
substr 123,234,345
substr      12,34.56:78
substr      123456789
instr       192.168.0.1
replace     (020)12345678
replace     001517729C28



regexp_like 例子:                --把满足条件的数据出来

语法:regexp_like(source_char,pattern,match_parameter)

1.select str from tmp where id='like' and regexp_like(str,'Ad+','i'); -- 'i' 忽略大小写
表达式的意思:A就是字母'A',d匹配一个数字字符,+匹配一个或多个出现,'i' 忽略大小写

结果:
id str
like a999
like a9c
like A7007
like 123a34cc
2.select str from tmp where id='like' and regexp_like(str,'bd+','i');
结果:2b3

3.select str from tmp where id='like' and regexp_like(str,'Ad+','i');
结果:A7007


4. select str from tmp where id='like' and regexp_like(str,'^ad+'); STR ------------- a9999 a9c
select str from tmp where id='like' and regexp_like(str,'^ad+$'); STR ------------- a9999


2.select str from tmp where id='like' and regexp_like(str,'Ad+','i'); -- 'i' 忽略大小写
表达式的意思:A就是字母'A',d匹配一个数字字符,+匹配一个或多个出现,'i' 忽略大小写
STR ------------- a9999 a9c A7007 123a34cc
select str from tmp where id='like' and regexp_like(str, 'ad+');

STR ------------- a9999 a9c 123a34cc
 select str from tmp where id='like' and regexp_like(str,'^ad+'); STR ------------- a9999 a9c
select str from tmp where id='like' and regexp_like(str,'^ad+$'); STR ------------- a9999

regexp_substr 例子:



regex_instr 例子:

select
  str,
  regexp_instr(str,'.'    ) ind1 ,
  regexp_instr(str,'.',1,2) ind2 ,
  regexp_instr(str,'.',5,2) ind3
from tmp where id='instr';
STR IND1 IND2 IND3 --------------- ----- ----- ----- 192.168.0.1 4 8 10 select regexp_instr('192.168.0.1','.',1,level) ind , -- 点号. 所在的位置 regexp_instr('192.168.0.1','d',1,level) ind -- 每个数字的位置 from dual connect by level <= 9 IND IND ----- ----- 4 1 8 2 10 3 0 5 0 6 0 7 0 9 0 11 0 0

regex_replace 例子:

select
  str,
  regexp_replace(str,'020','GZ') str1,
  regexp_replace(str,'(d{3})(d{3})','<21>') str2 -- 将第一、第二捕获组交换位置,用尖括号标识出来
from tmp
where id='replace'; 
STR str1 Str2 --------------- --------------- --------------- (020)12345678 (GZ)12345678 (020)<456123>78 001517729C28 001517729C28 <517001>729C28


--上面regexp_replace(str,'020','GZ')是遇到'020'就用'GZ'替换

SELECT REGEXP_REPLACE ('2, 5, and 10 are numbers in this example', 'd', '#')
FROM dual;

Result: '#, #, and ## are numbers in this example'

此示例将所指定的d数字将以#字符替换

我们可以改变我们的正则模式来搜索仅两位数字。

SELECT REGEXP_REPLACE ('2, 5, and 10 are numbers in this example', '(d)(d)', '#')
FROM dual;

Result: '2, 5, and # are numbers in this example'

这个例子将替换具有两个数字并排指定的(d)(d)模式。在这种情况下,它将跳过2和5个数字值和用#字符替换10。



综合应用的例子:

SELECT REGEXP_REPLACE ('itmyhome is my network id', '^(S*)', 'luck')
FROM dual;

Result: luck is my network id

这个例子会返回”luck is my network id”,

上面的 '^(S*)'就是不为空的意思

因为它会再字符串的开始找到第一个匹配的字符,然后替换为”luck”
---------------------------

原文地址:https://www.cnblogs.com/thomasbc/p/12526913.html