oracle 的正则表达式oracle的正则表达式(10g才可以用)
oracle的正则表达式(regular expression)简单介绍
目前oracle正则怎么用,正则表达式已经在很多软件中得到广泛的应用 , 包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境 。
Oracle 10g正则表达式提高了SQL灵活性 。有效的解决了数据有效性,重复词的辨认, 无关的空白检测,或者分解多个正则组成的字符串等问题 。
Oracle 10g支持正则表达式的四个新函数分别是oracle正则怎么用:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE 。
它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符 。
特殊字符:
'^' 匹配输入字符串的开始位置 , 在方括号表达式中使用 , 此时它表示不接受该字符集合 。
'$' 匹配输入字符串的结尾位置 。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '\n' 或'\r' 。
'.' 匹配除换行符 \n之外的任何单字符 。
'?' 匹配前面的子表达式零次或一次 。
'*' 匹配前面的子表达式零次或多次 。
' ' 匹配前面的子表达式一次或多次 。
'( )' 标记一个子表达式的开始和结束位置 。
'[]' 标记一个中括号表达式 。
'{m,n}' 一个精确地出现次数范围,m=出现次数=n,'{m}'表示出现m次,'{m,}'表示至少出现m次 。
'|' 指明两项之间的一个选择 。例子'^([a-z] |[0-9] )$'表示所有小写字母或数字组合成的字符串 。
\num 匹配 num,其中 num 是一个正整数 。对所获取的匹配的引用 。
正则表达式的一个很有用的特点是可以保存子表达式以后使用,被称为Backreferencing. 允许复杂的替换能力
如调整一个模式到新的位置或者指示被代替的字符或者单词的位置. 被匹配的子表达式存储在临时缓冲区
中,缓冲区从左到右编号, 通过\数字符号访问 。下面的例子列出了把名字 aa bb cc 变成cc, bb, aa.
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;
REGEXP_REPLACE('ELLENHILDISMIT
cc, bb, aa
'\' 转义符 。
字符簇:
[[:alpha:]] 任何字母 。
[[:digit:]] 任何数字 。
[[:alnum:]] 任何字母和数字 。
[[:space:]] 任何白字符 。
[[:upper:]] 任何大写字母 。
[[:lower:]] 任何小写字母 。
[[unct:]] 任何标点符号 。
[[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F] 。
各种操作符的运算优先级
\ 转义符
(), (?, (?=), [] 圆括号和方括号
*,, ?, {n}, {n,}, {n,m} 限定符
^, $, \anymetacharacter 位置和顺序
| “或”操作
--测试数据
create table test(mc varchar2(60));
insert into test values('112233445566778899');
insert into test values('22113344 5566778899');
insert into test values('33112244 5566778899');
insert into test values('44112233 5566 778899');
insert into test values('5511 2233 4466778899');
insert into test values('661122334455778899');
insert into test values('771122334455668899');
insert into test values('881122334455667799');
insert into test values('991122334455667788');
insert into test values('aabbccddee');
insert into test values('bbaaaccddee');
insert into test values('ccabbddee');
insert into test values('ddaabbccee');
insert into test values('eeaabbccdd');
insert into test values('ab123');
insert into test values('123xy');
insert into test values('007ab');
insert into test values('abcxy');
insert into test values('The final test is is is how to find duplicate words.');
commit;
一、REGEXP_LIKE
【oracle正则怎么用 oracle sql正则】select * from test where regexp_like(mc,'^a{1,3}');
select * from test where regexp_like(mc,'a{1,3}');
select * from test where regexp_like(mc,'^a.*e$');
select * from test where regexp_like(mc,'^[[:lower:]]|[[:digit:]]');
select * from test where regexp_like(mc,'^[[:lower:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'[^[:digit:]]');
Select mc FROM test Where REGEXP_LIKE(mc,'^[^[:digit:]]');
二、REGEXP_INSTR
Select REGEXP_INSTR(mc,'[[:digit:]]$') from test;
Select REGEXP_INSTR(mc,'[[:digit:]] $') from test;
Select REGEXP_INSTR('The price is $400.','\$[[:digit:]] ') FROM DUAL;
Select REGEXP_INSTR('onetwothree','[^[[:lower:]]]') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]*') FROM DUAL;
Select REGEXP_INSTR(',,,,,','[^,]') FROM DUAL;
三、REGEXP_SUBSTR
SELECT REGEXP_SUBSTR(mc,'[a-z] ') FROM test;
SELECT REGEXP_SUBSTR(mc,'[0-9] ') FROM test;
SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;
四、REGEXP_REPLACE
Select REGEXP_REPLACE('Joe Smith','( ){2,}', ',') AS RX_REPLACE FROM dual;
Select REGEXP_REPLACE('aa bb cc','(.*) (.*) (.*)', '\3, \2, \1') FROM dual;
如何使用oracle正则表达式截取字符串以前做过,用专业的话叫做数据清洗 。这样的数据往往是不同人员/在不同时间录入的 。
我的思路是这样:
第一步、去掉非关键字,保留关键字 。
拿“中国工商银行xxx支行”来说录入的名称可能存在很多情况比如“工商银行xxx支行”/“工行xxx支行”等,
针对这些情况我们要排除非关键字对数据的干扰,以”中国“开始的去掉”中国“二字,以”支行“结尾的去掉”支行“二字 。
第二步、同义词转换 。比如”工商银行“=”工行“,”农业银行“=”农行“等 。
第三步、数据标准化 。将不标准的名称更改成标准的名称 。
在清洗过程中 , 可以一边做一边,使用group by语句统计名称的个数,观察数据 。
这个是一个体力活 , 其中还可能存在错别字等情况 , 反正很烦 。
Oracle正则表达式 Oracle g数据库内建了符合IEEE POSIX (Portable Operating System for Unix)标准的正则表达式 熟练使用正则表达式 可以写出简洁 强大的SQL语句
正则表达式有几个优点优于常见的LIKE操作符和INSTR SUBSTR及REPLACE 函数的 这些传统的SQL 函数不便于进行模式匹配 只有LIKE 操作符通过使用%和_字符匹配 但LIKE不支持表达式的重复 复杂的更替 字符范围 字符列表和POSIX 字符类等等
元字符(Meta Character)
Sql代码
^使表达式定位至一行的开头
$使表达式定位至一行的末尾
*匹配 次或更多次
?匹配 次或 次
匹配 次或更多次
{m}正好匹配 m 次
{m }至少匹配 m 次
{m n}至少匹配 m 次但不超过 n 次
[:alpha:]字母字符
[:lower:]小写字母字符
[:upper:]大写字母字符
[:digit:]数字
[:alnum:]字母数字字符
[:space:]空白字符(禁止打?。?如回车符 换行符 竖直制表符和换页符[:punct:]标点字符
[:cntrl:]控制字符(禁止打?。?
[:print:]可打印字符 | 分隔替换选项 通常与分组操作符 () 一起使用
( )将子表达式分组为一个替换单元 量词单元或后向引用单元
[char]字符列表
Oracle g提供了四个regexp function: REGEXP_LIKE REGEXP_REPLACE REGEXP_INSTR REGEXP_SUBSTR
Sql代码
REGEXP_LIKE 比较一个字符串是否与正则表达式匹配
(srcstr pattern [ match_option])
REGEXP_INSTR 在字符串中查找正则表达式 并且返回匹配的位置
(srcstr pattern [ position [ occurrence [ return_option [ match_option]]]])
REGEXP_SUBSTR 返回与正则表达式匹配的子字符串
(srcstr pattern [ position [ occurrence [ match_option]]])
REGEXP_REPLACE 搜索并且替换匹配的正则表达式
(srcstr pattern [ replacestr [ position [ occurrence [ match_option]]]])其中各参数的含义为:
Sql代码
srcstr:被查找的字符数据
pattern:正则表达式
occurrence:出现的次数 默认为
position:开始位置
return_option: 默认值为 返回该模式的起始位置 值为 则返回符合匹配条件的下一个字符的起始位置
replacestr:用来替换匹配模式的字符串
match_option:匹配方式选项 缺省为c
c case sensitive
I case insensitive
n ( )匹配任何字符(包括newline)
m 字符串存在换行的时候被作为多行处理
下面通过一些具体的例子来说明如何使用这四个函数 首先创建一个测试数据表
Sql代码
SQL create table person (
first_name varchar( )
last_name varchar( )
email varchar( )
zip varchar( ));
Table created
SQL insert into person values ( Steven Chen );
row created
SQL insert into person values ( James Li || chr( ) || b d f );
row created
SQL mit;
Commit plete
SQL select * from person;
FIRST_NAME LAST_NAMEEMAILZIP
StevenChen
JamesLib d f
REGEXP_LIKE
Sql代码
SQL select zip as invalid_zip from person where regexp_like(zip [^[:digit:]] );
INVALID_ZIP
b d f
SQL select first_name from person where regexp_like(first_name ^S *n$ );
FIRST_NAME
Steven
SQL select first_name from person where regexp_like(first_name ^s *n$ );
no rows selected
SQL select first_name from person where regexp_like(first_name ^s *n$ c );
no rows selected
SQL select first_name from person where regexp_like(first_name ^s *n$ i );
FIRST_NAME
Steven
SQL select email from person where regexp_like(email ^james *$ );
no rows selected
SQL select email from person where regexp_like(email ^james *$ n );
EMAIL
SQL select email from person where regexp_like(email ^li *$ );
no rows selected
SQL select email from person where regexp_like(email ^li *$ m );
EMAIL
REGEXP_INSTR
Sql代码
查找zip中第一个非数字字符的位置
SQL select regexp_instr(zip [^[:digit:]] ) as position from person;
POSITION
从第三个字符开始 查找zip中第二个非数字字符的位置
SQL select regexp_instr(zip [^[:digit:]] ) as position from person;
POSITION
从第三个字符开始 查找zip中第二个非数字字符的下一个字符位置
SQL select regexp_instr(zip [^[:digit:]] ) as position from person;
POSITION
REGEXP_SUBSTR
Sql代码
SQL select regexp_substr(zip [^[:digit:]] ) as zip from person;
ZIP
b
SQL select regexp_substr(zip [^[:digit:]] ) as zip from person;
ZIP
f
REGEXP_REPLACE
Sql代码
把zip中所有非数字字符替换为
SQL update person set zip=regexp_replace(zip [^[:digit:]] )
where regexp_like(zip [^[:digit:]] );
row updated
SQL select zip from person;
ZIP
后向引用(backreference)
后向引用是 一个很有用的特性 它能够把子表达式的匹配部分保存在临时缓冲区中 供以后重用 缓冲区从左至右进行编号 并利用 \digit 符号进行访问 子表达式用一组圆括号来显示 利用后向引用可以实现较复杂的替换功能
Sql代码
SQL select regexp_replace( Steven Chen ( *) ( *) \ \ ) as reversed_name from dual;
REVERSED_NAME
Chen Steven
在DDL中也可以正则表达式 比如Constraint index view
Sql代码
SQL alter table person add constraint constraint_zip check (regexp_like(zip ^[[:digit:]] $ ));
lishixinzhi/Article/program/Oracle/201311/18745
怎么在 oracle 存储过程中 使用正则表达式15:45:11 SQL select substr('2:1:3',instr('2:1:3',':',2) 1,
15:45:142instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from dual;
S
-
1
已用时间:00: 00: 00.15
15:45:19 SQL select substr('2:1:3',1,instr('2:1:3',':')-1) from dual;
S
-
2
已用时间:00: 00: 00.15
15:45:36 SQL select substr('2:1:3',instr('2:1:3',':',2) 1,
15:45:382instr('2:1:3',':',3)-instr('2:1:3',':',2)-1) from dual;
S
-
1
已用时间:00: 00: 00.16
15:45:56 SQL select substr('2:1:3',instr('2:1:3',':',3) 1) from dual;
S
-
3
已用时间:00: 00: 00.16
15:46:02 SQL
在oracle中如何使用正则函数表达式截取每一行中的每一个单元格中有多行数据的第一列?函数格式如下oracle正则怎么用:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要进行正则处理oracle正则怎么用的字符串
__pattern :进行匹配的正则表达式
__position :起始位置oracle正则怎么用 , 从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier :模式('i'不区分大小写进行检索;'c'区分大小写进行检索 。默认为'c' 。)
Oracle10gR2中用正则表达式搜索文本Oracle g Release 为了与文本字符串中的模式相匹配 添加了对POSIX正则表达式的支持 Release 用一些附加的可以在Perl找到的元字符 扩充了最初的模式元字符目录 如果你正在用Oracle gR 开发脚本 那么就看看本文里这些搜索文本的有效捷径
首先 简短概述一下:函数REGEXP_LIKE针对一种模式搜索一个字符列 返回一个TRUE或FALSE的逻辑值 你可以在SQL SELECT语句的WHERE子句中用它来限定行数 或者在PL/SQL块中检查数据的有效性 相似的函数——REGEXP_REPLACE REGEXP_SUBSTR和REGEXP_INSTR——都能够在执行其他常见的字符串操作时 接受POSIX正则表达式
Perl为POSIX 类 表达式添加了一些简短的模式 例如 在标准的POSIX正则表达式中 你用符号 [[:digit:]] 来表示一个从 到 的阿拉伯数字 在Perl中 它被简化成 \d 大括号表示一次重复计数 因此 \d{ } 规定了三个阿拉伯数字 要表示你想要一个除阿拉伯数字之外的字符 POSIX模式是 [^[:digit:]] 但是在Perl中 它只表示为 \D
类似的捷径对于空白也存在: \s 与 [[:space:]] 相对应 非空白: \S 对应 [^[:space:]] 列表A中显示了一个取自人力资源方案的例子 列表A
SQL SELECT last_name FROM employees WHERE REGEXP_LIKE(last_name [[:space:]] );
LAST_NAME
De Haan
SQL SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name \s );
LAST_NAME
De Haan
SQL SELECT last_name FROM employees WHERE REGEXP_LIKE (last_name \S ) AND ROWNUM;
LAST_NAME
AbelAnde
Atkinson
Austin
BaerBaida
Banda
Bates
Bell
Bernstein
rows selected
Perl通过对运算符添加(?) 用 非贪婪型 匹配运算符扩充了POSIX中的 贪婪型 匹配运算符 例如 符号 ^ { } 与至少两个 最多五个 开头的值相匹配 但是 解释是 贪婪的 它尽可能地与最长的字符串相匹配 如果列中包括了 这种符号将与前五个 匹配 但是 符号 ^ { }? 是 非贪婪的 它与最短的字符串匹配 这样 就只有两个 了 列表B中是一个利用REGEXP_SUBSTR的例子
列表B
SQL CREATE TABLE testtab (x VARCHAR ( ));
Table created
SQL BEGINFOR i IN LOOPINSERT INTO testtab VALUES (LPAD( i ));END LOOP;END;/
PL/SQL procedure successfully pleted
SQL SELECT x FROM testtab;
X
rows selected
SQL SELECT REGEXP_SUBSTR(x ^ { } )FROM testtab;
REGEXP_SUB
rows selected
SQL SELECT REGEXP_SUBSTR(x ^ { }? )FROM testtab;
REGEXP_SUB
rows selected
lishixinzhi/Article/program/Oracle/201311/17650
oracle正则怎么用的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于oracle sql正则、oracle正则怎么用的信息别忘了在本站进行查找喔 。
推荐阅读
- 现成软件小程序怎么弄,自己app实现小程序
- 地产的新媒体如何运营策划,地产的新媒体如何运营策划方案
- 如何理解新媒体的新,如何理解新媒体的新观念
- 钉钉直播点赞干嘛的,钉钉上直播点赞有什么用
- go语言读取ini go语言读取大文件
- jpg图片文件怎么做手机,手机jpg,jpeg格式的图片怎么做
- 关于棋牌游戏现实的信息
- javascript计算偶数,js判断数字奇偶
- vb.net2008多大 vbnet keydown