文档章节

在 Oracle 中使用正则表达式

 如月王子
发布于 2015/04/13 22:39
字数 958
阅读 11
收藏 0
点赞 0
评论 0

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

1。regexp_like

2。regexp_substr

3。regexp_instr

4。regexp_replace

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

 

regexp_like 只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配,语法很简单:

regexp_like_condition

regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,语法如下:

regexp_substr regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:

regexp_instr

regexp_replace 函数,和 replace 类似,用于替换符合正则表达式的字符串,语法如下:

regexp_replace

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

1。source_char,输入的字符串,可以是列名或者字符串常量、变量。

2。pattern,正则表达式。

3。match_parameter,匹配选项。

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

4。position,标识从第几个字符开始正则表达式匹配。

5。occurrence,标识第几个匹配组。

6。replace_string,替换的字符串。

 

说了一堆文绉绉的,现在开始实例演练了,在此之前先建好一个表。

create table tmp as 
with data as (
  select 'like' as id ,'a9999' as str from dual union all
  select 'like'       ,'a9c'          from dual union all
  select 'like'       ,'A7007'        from dual union all
  select 'like'       ,'123a34cc'     from dual union all 
  select 'substr'     ,'123,234,345'  from dual union all
  select 'substr'     ,'12,34.56:78'  from dual union all
  select 'substr'     ,'123456789'    from dual union all
  select 'instr'      ,'192.168.0.1'  from dual union all
  select 'replace'    ,'(020)12345678' from dual union all
  select 'replace'    ,'001517729C28' from dual  
)
select * from data ;

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

regexp_like 例子:

select str from tmp where id='like' and regexp_like(str,'A\d+','i'); -- 'i' 忽略大小写
STR
-------------
a9999
a9c
A7007
123a34cc

select str from tmp where id='like' and regexp_like(str, 'a\d+');
STR
-------------
a9999
a9c
123a34cc

select str from tmp where id='like' and regexp_like(str,'^a\d+');
STR
-------------
a9999
a9c

select str from tmp where id='like' and regexp_like(str,'^a\d+$');
STR
-------------
a9999

regexp_substr 例子:

col str format a15;
select 
  str,
  regexp_substr(str,'[^,]+')     str,
  regexp_substr(str,'[^,]+',1,1) str,
  regexp_substr(str,'[^,]+',1,2) str,  -- occurrence 第几个匹配组
  regexp_substr(str,'[^,]+',2,1) str   -- position 从第几个字符开始匹配
from tmp
where id='substr';
STR             STR             STR             STR             STR
--------------- --------------- --------------- --------------- ---------------
123,234,345     123             123             234             23
12,34.56:78     12              12              34.56:78        2
123456789       123456789       123456789                       23456789

select 
  str, 
  regexp_substr(str,'\d')        str,
  regexp_substr(str,'\d+'  ,1,1) str,
  regexp_substr(str,'\d{2}',1,2) str,
  regexp_substr(str,'\d{3}',2,1) str 
from tmp      
where id='substr';
STR             STR             STR             STR             STR
--------------- --------------- --------------- --------------- ---------------
123,234,345     1               123             23              234
12,34.56:78     1               12              34
123456789       1               123456789       34              234


select regexp_substr('123456789','\d',1,level) str  --取出每位数字,有时这也是行转列的方式
from dual
connect by level<=9
STR
---------------
1
2
3
4
5
6
7
8
9

regex_instr 例子:

col ind format 9999;
select
  str, 
  regexp_instr(str,'\.'    ) ind ,
  regexp_instr(str,'\.',1,2) ind ,
  regexp_instr(str,'\.',5,2) ind
from tmp where id='instr';
STR               IND   IND   IND
--------------- ----- ----- -----
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') str,
  regexp_replace(str,'(\d{3})(\d{3})','<\2\1>') str -- 将第一、第二捕获组交换位置,用尖括号标识出来
from tmp
where id='replace';  
STR             STR             STR
--------------- --------------- ---------------
(020)12345678   (GZ)12345678    (020)<456123>78
001517729C28    001517729C28    <517001>729C28

综合应用的例子:

col row_line format a30;
with sudoku as (
  select '020000080568179234090000010030040050040205090070080040050000060289634175010000020' as line
  from dual
),
tmp as (
  select regexp_substr(line,'\d{9}',1,level) row_line,
  level col
  from sudoku
  connect by level<=9
)
select regexp_replace( row_line ,'(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)(\d)','\1 \2 \3 \4 \5 \6 \7 \8 \9') row_line
from tmp

ROW_LINE
------------------------------
0 2 0 0 0 0 0 8 0
5 6 8 1 7 9 2 3 4
0 9 0 0 0 0 0 1 0
0 3 0 0 4 0 0 5 0
0 4 0 2 0 5 0 9 0
0 7 0 0 8 0 0 4 0
0 5 0 0 0 0 0 6 0
2 8 9 6 3 4 1 7 5
0 1 0 0 0 0 0 2 0

本文转载自:http://www.cnblogs.com/killkill/archive/2010/09/06/1819536.html

共有 人打赏支持
粉丝 15
博文 177
码字总数 3194
作品 0
淮安
Oracle 查询不区分大小写 (正则函数)

//不区分大小写查询REGEXPLIKE(字段名, '(" + keyword+ ")', 'i') " ); Oracle中的Like操作符使用''和'%'作为通配符,使用就像这样: SELECT name FROM testlike WHERE name like 'a%'; 即匹...

-wangming-
2016/04/18
88
0
使用正规表达式编写更好的SQL

Oracle Database 10g 中的正规表达式特性是一个用于处理文本数据的强大工具   Oracle Database 10g 的一个新特性大大提高了您搜索和处理字符数据的能力。这个特性就是正规表达式,是一种用...

余二五
2017/11/08
0
0
java和JavaScript 正则区别

JavaScript var myReg = /^d+$/; if (!myReg.test(eleval)){ alert("修改内容需要是数字!"); } 其中JavaScript中其和正则表达式中的元字符一样,不需要转义。因为在JavaScript中其定义就是一...

SKYCOBS
2016/03/02
64
1
ORACLE中的支持正则表达式的函数

ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与...

滩头沙
2011/09/18
0
0
Oracle中REGEXP_SUBSTR函数

Oracle中REGEXPSUBSTR函数 Oracle中REGEXPSUBSTR函数的使用说明: 题目如下: 在oracle中,使用一条语句实现将'17,20,23'拆分成'17','20','23'的集合。 REGEXPSUBSTR函数格式如下: functi...

买个ZIPPO点蚊香
2015/12/11
29
0
oracle中通过正则表达式函数处理逗号分隔的字段

这个题目的确不大好写,其实际含义基于一个场景: 比如在oracle的某张表中,有两个字段 A1 B1 1 A,B,C,D, 2 E,F 假如现在的需求,是要统计A1中,每条记录拥有多少个数目的B1,比如 A1=1的时候...

jackyrong
2013/03/12
0
0
Hive使用regexp,RLIKE需要使用转义字符

使用Hive做数据清洗,经常需要使用正则表达式。 比较讨厌的是,正则表达式匹配失败的时候,hive完全不会报错。 原来的写法 SELECT * from ahhs_product_info where product_name NOT RLIKE '...

吐槽的达达仔
2014/12/05
0
0
oracle使用正则表达式提取ip地址

原始字段中将所有日志都记录成一条信息了 类似于 张三使用账号zhangshan在2015年11月11号使用[客户端IP]:192.168.1.1,111.83.2.31,[mac地址:]XXXXXXX登录了系统。 现在我需要使用oracle的正则...

text_android
2015/01/29
1K
2
别有一番风味的正则表达式

写一个用于判断给定字符串是否只包含数字或者字母的正则表达式。 针对这样需要,我们可以采用类似于如下的方式实现。 参考https://docs.oracle.com/javase/7/docs/api/java/util/regex/Patte...

王孟君
2016/11/03
327
0
oracle正则表达式regexp_like用法

/ ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXPLIKE :与LIKE的功能相似 2,REGEXPINSTR :与INSTR的功能相似 3,REGEXPSUBSTR :与SUBSTR的功能相似 4,REGEXPREPLACE :与R...

晨曦之光
2012/03/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

HBase in Practice - 性能、监控及问题解决

李钰(社区ID:Yu Li),阿里巴巴计算平台事业部高级技术专家,HBase开源社区PMC&committer。开源技术爱好者,主要关注分布式系统设计、大数据基础平台建设等领域。连续4年基于HBase/HDFS设计和...

中国HBase技术社区
9分钟前
1
0
ES18-JAVA API 批量操作

1.批量查询 Multi Get API public static void multiGet() {// 批量查询MultiGetResponse response = getClient().prepareMultiGet().add("my_person", "my_index", "1")// 查......

贾峰uk
14分钟前
0
0
SpringBoot2.0使用health

1,引入actuator <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency> 2,application.properties ......

暗中观察
21分钟前
0
0
阿里巴巴Java开发规约

###编程规约 命名风格 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。...

简心
25分钟前
0
0
如何用TypeScript来创建一个简单的Web应用

转载地址 如何用TypeScript来创建一个简单的Web应用 安装TypeScript 获取TypeScript工具的方式: 通过npm(Node.js包管理器) npm install -g typescript 构建你的第一个TypeScript文件 创建...

durban
30分钟前
0
0
分享好友,朋友圈自定义分享链接无效

这个问题是微信6.5.6版本以后,修改了分享规则:分享的连接必须在公众号后台设定的js安全域名内

LM_Mike
47分钟前
0
0
2018年7月23日课程

一、LVS-DR介绍 director分配请求到不同的real server。real server 处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了...

人在艹木中
51分钟前
0
0
Mac下idea卡顿

idea在加载相对来说比较大的系统时,经常性出现卡顿,就是直接卡死,以至于写起代码特别难受(...极其需要耐心 最后找到的解决方案是修改idea.vmoptions中的内存大小 find / -name idea.vmop...

张欢19933
54分钟前
0
0
git提示error setting certificate verify locations

进入到你的repository 按住shift键,鼠标右键,选择git bash窗口 执行 git config --system http.sslverify false 重新回到Idea中,重新push,输入用户和密码 push 成功 如果打开git bash窗口...

特拉仔
今天
0
0
shell练习题20180723

编写shell脚本,计算1-100的和; [root@yong-01 20180723]# vim sum100.sh#!/bin/bashsum=0for i in `seq 1 100`do sum=$[$sum+$i]doneecho $sum 编写shell脚本,要求输入...

lyy549745
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部