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);>12select 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-7890regexp_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]';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返回1SELECT 'abvsdfcsd' REGEXP'd$'
--->1
匹配到末尾为d返回1SELECT 'abvsdfcsd' REGEXP'.f','abvsdfcsd' REGEXP'.h'
--->1   0
匹配到其后面的字符返回为1SELECT 'abvsdfcsd' REGEXP '[fhk]'
--->1
任意字符匹配上即返回为1SELECT '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'作为一个整体,所以它匹配不了aSELECT 'stab' REGEXP '.ta*b';
--->1
匹配到一个t  0个或多个a  一个 b返回1SELECT 'stab' REGEXP '.tba*';
--->0
注意区别SELECT '' REGEXP 'a*'
--->1    包括字符串。可以当占位符使用SELECT 'stab' REGEXP '.ta+b';
--->1SELECT 'stb' REGEXP '.ta+b';--->0
SELECT 'stb' REGEXP '.ta?b';
--->1
SELECT 'stab' REGEXP '.ta?b';
--->1
SELECT 'staab' REGEXP '.ta?b';
--->0SELECT 'a' REGEXP 'a|b';
--->1
匹配a或bSELECT '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';
--->0a{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';
--->1

举例3

b.capacity_name IN ( "初级经销商","区级代理商","中级经销商", "市级代理商", "省级代理商", "高级经销商", "特约经销商" ) ;
b.`capacity_name` REGEXP '^(初级|区级|特约|高级|中级|市级|省级)(经销商|代理商)$';
b.capacity_name  REGEXP '^.{2,}(经销商|代理商)$';
以任意字符开头且大于等于2个,同时以经销商或者代理商结尾

LIKE

在LIKE匹配时,%表示匹配任意多个字符,_表示匹配单个字符,如果要匹配%或_本身,则要对其进行转义,\%匹配字符%, \匹配字符

'abcd' like 'ab%' -- true
'abcd' like 'ab_' -- false
'ab_cde' like 'ab\\_c%'; -- true

转义符
系统采用反斜线\作为转义符,因此正则表达式的模式中出现的\都要进行二次转义
其中+是正则中的一个特殊字符,因此要用转义的方式表达,在正则引擎中的表达方式是a\+b。由于系统还要解释一层转义,因此能够匹配该字符串的表达式是a\+b

select 'a+b' rlike 'a\\\+b' from test_dual;
>trueselect 'a\\b', 'a\\b' rlike 'a\\\b' from test_dual;
>| a\b   | false
select 'a\\b', 'a\b' rlike 'a\\\b' ;
>|a\b    |true

Reference:
https://www.cnblogs.com/aaronthon/p/8479841.html
https://help.aliyun.com/document_detail/27871.html?spm=a2c4g.11186623.4.1.20b119bc6z0b7d

odps sql 常用正则表达式相关推荐

  1. MaxCompute SQL函数详解 ODPS SQL函数详解---之常用数学运算相关函数

    MaxCompute SQL函数详解 ODPS SQL函数详解---之常用数学运算相关函数 MaxCompute/ODPS SQL常用数学运算相关函数 ABS函数-计算绝对值 sql:select A ...

  2. PHP常用正则表达式汇总 [复制链接]

    PHP常用正则表达式汇总 [复制链接] 上一主题下一主题   离线我是小猪头 法师 发帖 539 加关注 发消息 只看楼主 倒序阅读 使用道具楼主  发表于: 2011-06-22 更多 - 本帖被 ...

  3. 用正则表达式替换html标签,在SQL中用正则表达式替换html标签

    由于数据库的一个表字段中多包含html标签,现在需要修改数据库的字段把html标签都替换掉.当然我可以通过写一个程序去修改,那毕竟有点麻烦.直接在查询分析器中执行,但是MS SQL Server并没有 ...

  4. 常用正则表达式合集与工具

    any-rule 维护了一个常用正则表达式合集,并且本身是一个支持 Web/VS Code/idea/Alfred Workflow 多平台的正则表达式工具. image 安装 VS Code 应用商 ...

  5. Python正则匹配HTML,python正则匹配html标签_Python爬虫常用正则表达式及HTML网页标签分析总结...

    这篇文章主要是介绍Python爬取网页信息时,经常使用的正则表达式及方法.它是一篇总结性文章,实用性比较大,主要解决自己遇到的爬虫问题,也希望对你有所帮助~ 当然如果会Selenium基于自动化测试爬 ...

  6. ylb:SQL 常用函数

    ylbtech-SQL Server: SQL Server-SQL 常用函数 1,数学函数 2,日期和时间函数 3,字符串函数 4,转换函数 1,ylb:SQL 常用函数返回顶部 1,数学函数 2, ...

  7. 转载:常用正则表达式大全!(例如:匹配中文、匹配html)

    常用正则表达式大全!(例如:匹配中文.匹配html) 匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[ ...

  8. 前端开发中的 正则表达式 及常用正则表达式大全

    RegExp 是正则表达式(Regular expression)的缩写,就是用一个"字符串"来描述一个特征,然后去验证另一个"字符串"是否符合这个特征.比如 ...

  9. shell 常用正则表达式

    "^\d+$" //非负整数(正整数 + 0)  "^[0-9]*[1-9][0-9]*$" //正整数  "^((-\d+)|(0+))$" ...

最新文章

  1. React 深入系列3:Props 和 State
  2. oracle变态错误解决:ORA-00604: 递归 SQL 级别 2 出现错误
  3. 随机分配座位,共50个学生,使学号相邻的同学座位不能相邻
  4. JS面向对象,创建,继承
  5. Linux驱动入门基础基础知识
  6. [html] 在网格布局中都有哪些概念呢?比如:网格线
  7. xss过滤器无法处理ajax请求_thunkPHP 预防XSS攻击
  8. 给 WordPress 博客添加 Tabs 标签切换功能
  9. 给大楼装上转动外壳减少风力作用
  10. 手机html5编辑器哪个好,3款容易上手的HTML5编辑工具推荐~
  11. 计算机cpu一直超频,电脑卡顿怎么办,CPU超频让老电脑起死回生,大神带你玩转CPU!...
  12. 前端加速必备之BootCDN
  13. 微信小程序:enablePullDownRefresh、onReachBottomDistance 、动态设置窗口的背景色、动态设置下拉背景字体
  14. 牛客网之SQL---持续更新
  15. 七彩虹 pci内存控制器 感叹号 蓝屏 DPC_WATCHDOG_VIOLATION
  16. 从工地转行软件测试,拿下13k+年终奖是种什么体验?
  17. Excel基础(02)单元格格式
  18. 微创新只是大公司用来挤压小公司的武器,但绝不是小公司与大公司竞争的法宝。——转自傅盛...
  19. CentOS7 NGROK服务器搭建 无需域名
  20. reCAPTCHA v3 验证

热门文章

  1. win10 蓝牙耳机配对成功,但无法连接
  2. 我体验过VR,还行吧
  3. 智能算法实现PID智能车控制系统
  4. 《软件过程管理》 第四章 软件过程需求管理
  5. 用户画像系列——认识每一个“你”:微博中的用户模型
  6. 区块链为供应链建立全链路溯源防伪体系提供保障
  7. Unity【Tutorial——Beginner——Unity NavMesh】
  8. tornado中数据库ORM操作(二):通过peewee-async集成到tornado中
  9. 钱继志 计算机教程,photoshop
  10. 计算机主机控制分机,主分机设置