Oracle 正则表达式详解(regexp_substr、regexp_instr、regexp_replace、regexp_like)

这篇具有很好参考价值的文章主要介绍了Oracle 正则表达式详解(regexp_substr、regexp_instr、regexp_replace、regexp_like)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章目录
1 概述
2 匹配规则
3 正则函数
3.1 regexp_substr()
3.2 regexp_instr()
3.3 regexp_replace()
3.4 regexp_like()
1 概述
1. 作用:处理字符时,很强大
1
2. 分类:与下列相似,但功能更加强大(‘支持正则表达式’)
(1) regexp_like : 同 like 功能相似(模糊 ‘匹配’)
(2) regexp_instr : 同 instr 功能相似(返回字符所在 ‘下标’)
(3) regexp_substr : 同 substr 功能相似(‘截取’ 字符串)
(4) regexp_replace: 同 replace 功能相似( ‘替换’ 字符串)
– 使用了 ‘正则表达式’ 替代了老的 ‘百分比 %’ 和 ‘通配符 _’
– 上述 四个 函数,正则用法相似,知晓一个,其它皆可参考

2 匹配规则
主要的类型如下:

分组    元字符    描述
特殊的    \    转义字符。“\n”:换行,"\\n":文本 ‘\n’
.    匹配除转义字符外的 任何单字符
定位元字符    ^    使表达式定位至一行的 开头
$    使表达式定位至一行的 末尾
量词或重复操作符    *    匹配 0 次或多次(任意次数)
?    匹配 0 次或 1 次(最多 1 次)
+    匹配 1 次或多次(至少 1 次)
{m}    正好 匹配 m 次
{m, }    至少 匹配 m 次
{m, n}    匹配 m 到 n 次
表达式的替换和分组    |    替换,通常和分组操作符 () 一起使用
()    分组,并且 的关系
[char]    字符列表,或者 的关系
预定义的 posix 字符类    [:alpah:]    任何字母
[:lower:]    任何小写字母
[:upper:]    任何大写字母
[:digit:]    任何数字,相当于 [0-9]
[:xdigit:]    任何 16 进制的数字,相当于 [0-9a-fA-F]
[:alnum:]    任何字符或数字字符
[:space:]    空白字符,如:回车符,换行符、竖直制表符和换页符
[:punct:]    任何标点符号
示例:此案例来源于网络,略作修改,挺适合参考的

1. 查询 value 中以 1 开头 60 结尾的记录并且长度是 7 位
select * from table_name where value like '1____60'; -- 4 个 _
select * from table_name where regexp_like(value, '1....60');
2. 查询 value 中以 1 开头 60 结尾的记录并且长度是 7 位且全部是数字的记录
   此时,用 like 就不是很好实现了
select * from table_name where regexp_like(value, '^1[0-9]{4}60$');
select * from table_name where regexp_like(value, '^1[[:digit:]]{4}60$');
3. 查询 value 中不包含任何数字的记录
select * from table_name where regexp_like(value, '^[^[:digit:]]+$'); -- [] 内的 ^ 表示 '非'
4. 查询 value 中不是纯数字的记录
select * from table_name where not regexp_like(value, '^[[:digit:]]+$');
5. 查询以 12 或 1b 开头的记录,区分大小写
select * from table_name where regexp_like(value, '^(12)|^(1b)');
select * from table_name where regexp_like(value, '^1[2b]');
6. 查询以 12 或 1b 开头的记录,不区分大小写
select * from table_name where regexp_like(value, '^1[2b]', 'i');
7. 查询所有均为 小写字母 或 数字的记录
select * from table_name where regexp_like(value, '^([a-z]+|[0-9]+)$');
8. 查询包含 空白 的记录
select * from table_name where regexp_like(value, '[[:space:]]');
9. 查询包含 标点符号 的记录
select * from table_name where regexp_like(value, '[[:punct:]]');

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
3 正则函数
扩展:Oracle 官方文档 - regexp_substr
3.1 regexp_substr()

参数解释:

srcstr         : 源字符串 -- source string
pattern        : 正则表达式
position       : 起始位置,默认 1
occurrence     : 第几次出现,默认 1(匹配成功的次数,依次递增)
modifier       : 模式('i': 不区分大小写,'c': 区分大小写。 默认 'c')
subexpression: 含有子表达式 0-9, 默认 0:不含子表达式,1:第一个子表达式,以此类推

 
 
1
2
3
4
5
6
例1:

select regexp_substr('abc,CBA121ABC,cba', ',[^,]+,') rs1, -- ,CBA121ABC,
       regexp_substr('1234567890', '(123)(4(56)(78))', 1, 1, 'i', 1) rs2 -- 123
  from dual;

 
 
1
2
3
例2:拆分邮箱

with temp_email as (
  select 1 user_no, 'a1@qq.com' email from dual union all
  select 2 user_no, 'bb2@sina.com' email from dual union all
  select 3 user_no, 'ccc3@aliyun.com' email from dual
)
select t.user_no 用户编号,
       regexp_substr(t.email,'[[:alnum:]]+') 用户名,
       regexp_substr(t.email, '\@[[:alnum:]]+\.[[:alnum:]]+') 邮箱后缀
       -- 两者等同
       -- regexp_substr(t.email,'[a-zA-Z0-9]+') 用户名2,
       -- regexp_substr(t.email, '\@[a-zA-Z0-9]+\.[a-zA-Z0-9]+') 邮箱后缀2
  from temp_email t;

 
 
1
2
3
4
5
6
7
8
9
10
11
12
测试结果:

用户编号    用户名    邮箱后缀
1        a1        @qq.com
2        bb2        @sina.com
3        ccc3    @aliyun.com

 
 
1
2
3
4
例3:匹配固定电话号码和手机号码

--*************************************************************
-- 固定电话格式:0开头 + 2到3位任意数字 + '-' + 6到7位任意数字
-- 手机号码格式:1开头 + 10位任意数字(11位)
--*************************************************************
with temp_phone as (
  select 1 user_no, '0755-11112222' phone_no from dual union all
  select 2 user_no, '055-33334444'  phone_no from dual union all
  select 3 user_no, '0755 55556666' phone_no from dual union all
  select 4 user_no, 'AE86-77778888' phone_no from dual union all
  select 5 user_no, '0755-888999'   phone_no from dual union all
  select 6 user_no, '15866668888'   phone_no from dual union all
  select 7 user_no, '015866668888'  phone_no from dual
)
select t.user_no 用户编号,
       t.phone_no 联系方式,
       regexp_substr(t.phone_no,'^0[0-9]{2,3}-[0-9]{6,7}') 固定电话,
       regexp_substr(t.phone_no,'^1[0-9]{10}') 手机号码
  from temp_phone t;

 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
测试结果:


3.2 regexp_instr()


参数解释:

srcstr         : 源字符串 -- source string
pattern        : 正则表达式
position       : 起始位置,默认 1
occurrence     : 第几次出现,默认 1(匹配成功的次数,依次递增)
returnparam  : 返回参数对应的下标(0:第一个位置的下标,非0:最后一个位置的下标)
modifier       : 模式('i': 不区分大小写,'c': 区分大小写。 默认 'c')
subexpression: 含有子表达式 0-9, 默认 0:不含子表达式,1:第一个子表达式,以此类推

 
 
1
2
3
4
5
6
7
示例:

select regexp_instr('1,23,456,7890', '[0-9]+', 1, 3) 匹配到的第一个字符下标, -- 6
       regexp_instr('1,23,456,7890', '[0-9]+', 1, 3, 1) 最后一个字符后一位的下标, -- 9
       regexp_instr('1234567890', '(123)(4)(56)(78)', 1, 1, 0, 'i', 4) 匹配到的第四个子表达式 -- 7
  from dual;

 
 
1
2
3
4
查询结果:

匹配到的第一个字符下标    最后一个字符后一位的下标    匹配到的第四个子表达式
6                        9                        7

 
 
1
2
3.3 regexp_replace()


示例:

with temp_strings as (   
  select 'abc123' str from dual union all
  select '123abc' str from dual union all
  select 'a1b2c3' str from dual
)   
select t.str 源字符串,
       regexp_replace(t.str, '[0-9]', '', 1) 无数字字符串
  from temp_strings t;


查询结果:

	源字符串	无数字字符串
1	abc123	abc
2	123abc	abc
3	a1b2c3	abc


示例:

with temp_strings as (   
  select 'abc123' str from dual union all
  select '12abcd' str from dual union all
  select 'a1b2c3' str from dual
)   
select t.str 连续的三个数字字符
  from temp_strings t
 where regexp_like(t.str, '[0-9]{3}');


查询结果:文章来源地址https://www.toymoban.com/news/detail-487449.html

连续的三个数字字符
abc123

到了这里,关于Oracle 正则表达式详解(regexp_substr、regexp_instr、regexp_replace、regexp_like)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JS正则表达式:常用正则手册/RegExp/正则积累

    一、正则基础语法 JavaScript 正则表达式 | 菜鸟教程 JS正则表达式语法大全(非常详细) 二、使用场景 2.1、 校验中国大陆手机号的正则表达式 正则 解释 序号 正则 解释 1 ^1 以数字 1 开头 2 [3456789] 第二位可以是 3、4、5、6、7、8、9 中的任意一个 3 d{9} 后面是 9 个数字 示例代码

    2024年02月14日
    浏览(36)
  • MySQL数据库——MySQL REGEXP:正则表达式

    正则表达式主要用来查询和替换符合某个模式(规则)的文本内容。例如,从一个文件中提取电话号码,查找一篇文章中重复的单词、替换文章中的敏感语汇等,这些地方都可以使用正则表达式。正则表达式强大且灵活,常用于非常复杂的查询。 MySQL 中,使用  REGEXP  

    2024年02月01日
    浏览(36)
  • RegExp正则表达式左限定右限定左右限定,预查询,预查寻,断言 : (?<= , (?= , (?<! , (?!

    (?= , (?= , (?! , (?! 有好多种称呼 , 我称为: 左限定, 右限定, 左否定, 右否定 (?=左限定)    (?=右限定) (?!左否定)    (?!右限定) 再提炼 ?=    ?= ?!    ?! 其它的称呼 正则表达式预查寻分为 4 种: 正向肯定预查: (?=pattern) (?=pattern) 正向否定预查: (?!pattern) (?!pattern) 反向肯定预查

    2024年02月20日
    浏览(38)
  • oracle中的正则表达式

    ^ 使表达式定位至一行的开头 $ 使表达式定位至一行的末尾 * 匹配 0 次或更多次 ? 匹配 0 次或 1 次 + 匹配 1 次或更多次 {m} 正好匹配 m 次 {m,} 至少匹配 m 次 {m, n} 至少匹配 m 次但不超过 n 次 [:alpha:] 字母字符 [:lower:] 小写字母字符 [:upper:] 大写字母字符 [:digit:] 数字 [:alnum:] 字母数

    2024年02月09日
    浏览(35)
  • Oracle系列之十:Oracle正则表达式

    正则表达式 (Regular expression) 是一种强大的文本处理工具,Oracle数据库自9i版本开始引入了正则表达式支持,可帮助开发者快速而准确地匹配、查找和替换字符串,广泛应用于数据查询、数据分析、数据清洗等领域。 Oracle正则表达式的语法基于Perl语言的正则表达式语法,区分

    2024年02月06日
    浏览(40)
  • VBA提高篇_ 31 VBA调用正则表达式_RegExp.Pattern/Global/Execute(s)/Replace(s,r)

    RegExp对象: 属于外部对象,对应的变量需要声明为Object对象,并使用CreateObject函数创建 用于创建各种外部对象,只要将该对象的完整类名作为参数(字符串形式),即可返回一个该类的对象 例: CreateObject(“word.application”),返回一个微软的word对象,用于打开和修改Word对象 结果存入在M

    2024年02月09日
    浏览(35)
  • oracle的正则表达式(regular expression)

    当前,正则表达式已经在很多软件中得到广泛的应用,包括Linux, Unix,HP等操作系统,PHP,C#,Java等开发环境,ORACLE则在10G中推出了自己的正则表达式。 Oracle 10g正则表达式提高了SQL灵活性,有效的解决了数据有效性, 重复词的辨认, 无关的空白检测,或者分解多个正则组成的

    2024年02月07日
    浏览(33)
  • 正则表达式学习详解

    正则表达式(Regular Expression),通常简称为正则或正则表达式,是一种用于描述字符串模式的工具。它是由一系列字符和特殊字符组成的字符串,用于定义搜索模式或进行字符串匹配、替换、提取等操作。 正则表达式提供了一种灵活、强大且通用的方式来处理文本。它可以用

    2024年02月13日
    浏览(35)
  • shell 正则表达式详解

    目录 正则表达式 一,什么是正则表达式 二,为什么使用正则表达式 三,如何使用正则表达式 示例: 四,基本正则表达式 基本正则表达式示例: 正则表达式字符集示例: 五,扩展正则表达式 扩展正则表达式示例: 扩展:        正则表达式是通过一些特殊字符的排列,

    2024年01月17日
    浏览(36)
  • 正则表达式 之 断言详解

    正则表达式的先行断言和后行断言一共有 4 种形式: (?=pattern) 零宽正向先行断言(zero-width positive lookahead assertion) (?!pattern) 零宽负向先行断言(zero-width negative lookahead assertion) (?=pattern) 零宽正向后行断言(zero-width positive lookbehind assertion) (?!pattern) 零宽负向后行断言(zero-width neg

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包