odpssql常⽤正则表达式
regexp_substr
命令格式:
regexp_substr(source, pattern[,start_position[,nth_occurrence]])
返回值:
source中匹配pattern指定模式的⼦串,任⼀输⼊参数为NULL返回NULL。
参数说明:
source: string类型,搜索的字符串。
pattern: string类型常量,要匹配的模型,pattern为空串时抛异常。
start_position: 整型常量,必须⼤于0。其它类型或⼩于等于0时抛异常,不指定时默认为1, 表⽰从source的第⼀个字符开始匹配。
nth_occurrence:整型常量,必须⼤于0,其它类型或⼩于等于0时抛异常。不指定时默认为1,表⽰返回第⼀次匹配的⼦串。
⽤途:
返回字符串source从start_position开始, 和pattern第n次(nth_occurrence)匹配的⼦串,没有匹配时返回NULL。
⽰例:
- 提取字符串中的数字
select regexp_substr('CYJ8-ABC','[0-9]+') ;
>8
select regexp_substr('mint choc中⽂12国3','[0-9]+',1,1);
>12
select regexp_substr('mint choc中⽂12国3','[0-9]+',1,2);
>3
SELECT regexp_substr('MLSP1_341',"[0-9]+",1,1)
>1
SELECT regexp_substr('MLSP1_341',"[0-9]+",1,2)
>341
SELECT split_part('MLSP1_341','_',1)
>MLSP1
SELECT split_part('MLSP1_341','_',2)
>341
regexp_replace
命令格式:
regexp_replace(source, pattern, replace_string, occurrence)
返回值:
将source字符串中匹配pattern的⼦串替换成指定字符串后返回,当输⼊source, pattern, occurrence参数为NULL时返回NULL,若replace_string为NULL且pattern有匹配,返回NULL,replace_string为NULL但pattern不匹配,则返回原串。
参数说明:
source: string类型,要替换的字符串。
pattern: string类型常量,要匹配的模式,pattern为空串时抛异常。
replace_string:string,将匹配的pattern替换成的字符串。
occurrence: bigint类型常量,必须⼤于等于0,表⽰将第⼏次匹配替换成replace_string,为0时表⽰替换掉所有的匹配⼦串。其它类型或⼩于0抛异常。
当引⽤不存在的组时,不进⾏替换。
例如:
regexp_replace("123.456.7890","([[:digit:]]{3})\\.([[:digit:]]{3})\\.([[:digit:]]{4})","(\\1)\\2-\\3",0) 结果为(123)456-7890
regexp_replace("abcd","(.)","\\1 ",0) 结果为"a b c d "
regexp_replace("abcd","(.)","\\1 ",1) 结果为"a bcd"
regexp_replace("abcd","(.)","\\2",1) 结果为"abcd",因为pattern中只定义了⼀个组,引⽤的第⼆个组不存在。
regexp_replace("abcd","(.*)(.)$","\\2",0) 结果为"d"
regexp_replace("abcd","a","\\1",0),结果为” \1bcd”,因为在pattern中没有组的定义,所以\1直接输出为字符。
RLIKE == REGEXP
元字
说明
符
^匹配开头
$匹配结尾
.匹配任意单个字符
*匹配0个或多个前⼀个得到的字符。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}
+匹配1次或多次前⼀个得到的字符。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}
匹配0次或1次
匹配修饰符,当该字符跟在任何⼀个其他限制符 (* 、+、?、 {n}、 {n,}、 {n,m})后⾯时,匹配模式为⾮贪婪模式。⾮贪婪模式尽可能少的匹配所
搜索的字符串, ⽽默认的贪婪模式则尽可能多的匹配所搜索的字符串
A|B匹配A或B
(…)将模式元素组成单⼀元素
{n}匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o {n,m}m 和 n 均为⾮负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。
[…]匹配出括号内的任意字符
[^…]匹配不包含在[]的字符
[a-d]匹配a、b、c、d任⼀字符
解释
元字符说明
^a匹配开头,如^a匹配以a或者A开头的字符串
a$匹配结尾,如a$匹配以a或者A结尾的字符串
a*匹配出0个或多个a (包括空符)
a+匹配出1个或多个a (不包括空符)
a?匹配出1个或0个a
a(m)匹配m个a
a(m,)匹配m个或更多个a
a(m,n)匹配m到n个a
a(,n)匹配0到n个a
(abc)*匹配abc序列0次或多次。abc是⼀个整体
A|B例如,‘z|food’ 能匹配 “z” 或 “food”。’(z|f)ood’ 则匹配 “zood” 或 “food”
[ab]匹配括号中的任⼀字符。模式匹配a或b
[…^]匹配补充括号内的任意字符
举例1
^ 匹配字符串开始位置,查询所有姓王的⼈名
select name from 表名 where name regexp '^王';
$ 匹配字符串结束位置,如查询所有姓名末尾是“明”的⼈名
select name from 表名 where name regexp '明$';
. 匹配除\n之外的任意单个字符,类似于_
[……] 匹配[]中包含的任何⼀个字符abcdef……xyz可以简写为[a-z],0123456789简写成[0-9],如查询出包含w/z/s的⼈名
select name from 表名 where name regexp '[wzs]';
如查询出不包含w/z/s的⼈名
select name from 表名 where name regexp '[^wzs]';
如查询出w/z/s开头的的⼈名
select name from 表名 where name regexp '^[wzs]';
[^……] 匹配不包含在[]的字符,如查询出除了w/z/s开头之外的⼈名
select name from 表名 where name regexp '^[^wzs]';
sql语句查询结果取反a|b|c 匹配a或b或c,如将绩效为A-或A或A+的员⼯查出来,假设绩效列名performance
select performance from 表名 where performance regexp 'A-|A|A+';
* 匹配前⾯的⼦表达式0次或多次 * 等价于{0,}
'str*'可以匹配st/str/strr/strrr……
重复0次或1次
'str?' 可以匹配st/str
+ 重复1次或多次 + 等价于 {1,}
'str+'可以匹配str/strr/strrr/strrrr……
** 举例2**
SELECT 'abvsdfcsd' REGEXP'^a'
--->1
返回结果1表⽰匹配,返回结果0表⽰不匹配.匹配到开头为a返回1
SELECT 'abvsdfcsd' REGEXP'd$'
--->1
匹配到末尾为d返回1
SELECT 'abvsdfcsd' REGEXP'.f','abvsdfcsd' REGEXP'.h'
--->1 0
匹配到其后⾯的字符返回为1
SELECT 'abvsdfcsd' REGEXP '[fhk]'
--->1
任意字符匹配上即返回为1
SELECT 'efg' REGEXP '^[XYZ]','efg' REGEXP '[^XYZ]','efg' REGEXP '^[^XYZ]';
--->0 1 1
REGEXP '^[XYZ]' 查询以X Y Z 开头的
REGEXP '[^XYZ]' 查询不包含X Y Z 的
REGEXP '^[^XYZ]' 查询不以X Y Z 开头的
SELECT 'abc' REGEXP '[^a]'
--->1 'abc'作为⼀个整体,所以它匹配不了a
SELECT 'stab' REGEXP '.ta*b';
--->1
匹配到⼀个t 0个或多个a ⼀个 b返回1
SELECT 'stab' REGEXP '.tba*';
注意区别
SELECT '' REGEXP 'a*'
--->1 包括字符串。可以当占位符使⽤
SELECT 'stab' REGEXP '.ta+b';
--->1
SELECT 'stb' REGEXP '.ta+b';
--->0
SELECT 'stb' REGEXP '.ta?b';
--->1
SELECT 'stab' REGEXP '.ta?b';
-
-->1
SELECT 'staab' REGEXP '.ta?b';
--->0
SELECT 'a' REGEXP 'a|b';
--->1
匹配a或b
SELECT 'b' REGEXP 'a|b';
--->1
SELECT 'b' REGEXP '^(a|b)';
--->1
SELECT 'a' REGEXP '^(a|b)';
-
-->1
ELECT 'c' REGEXP '^(a|b)';
--->0
^符合只有在[]内才是取反的意思,在别的地⽅都是表⽰开始处匹配
a{m}
匹配m个a
SELECT 'auuuuc' REGEXP 'au{4}c';
---> 1
SELECT 'auuuuc' REGEXP 'au{3}c';
--->0
a{m,}
匹配m个或者更多个a
SELECT 'auuuuc' REGEXP 'au{3,}c';
--->1
SELECT 'auuuuc' REGEXP 'au{4,}c';
---> 1
SELECT 'auuuuc' REGEXP 'au{5,}c';
---> 0
a{m,n}
匹配m到n个a,包含m和n
SELECT 'auuuuc' REGEXP 'au{3,5}c';
--->1
SELECT 'auuuuc' REGEXP 'au{4,5}c';
--->1
SELECT 'auuuuc' REGEXP 'au{5,10}c';
--->0
(abc)
将abc作为⼀个序列匹配,不⽤括号括起来都是⽤单个字符去匹配,如果要把多个字符作为⼀个整体去匹配就需要⽤到括号,所以括号适合上⾯的所有情况。 SELECT 'xababy' REGEXP 'x(abab)y';
---> 1
SELECT 'xababy' REGEXP 'x(ab)*y';
---> 1
SELECT 'xababy' REGEXP 'x(ab){1,2}y';
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论