oracle正则表达式的用法

合集下载

oracle正则表达式regexp_like的用法详解

oracle正则表达式regexp_like的用法详解

oracle正则表达式regexp_like的⽤法详解ORACLE中的⽀持正则表达式的函数主要有下⾯四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBSTR的功能相似4,REGEXP_REPLACE :与REPLACE的功能相似它们在⽤法上与Oracle SQL 函数LIKE、INSTR、SUBSTR 和REPLACE ⽤法相同,但是它们使⽤POSIX 正则表达式代替了⽼的百分号(%)和通配符(_)字符。

POSIX 正则表达式由标准的元字符(metacharacters)所构成:'^' 匹配输⼊字符串的开始位置,在⽅括号表达式中使⽤,此时它表⽰不接受该字符集合。

'$' 匹配输⼊字符串的结尾位置。

如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 '/n' 或 '/r'。

'.' 匹配除换⾏符之外的任何单字符。

'?' 匹配前⾯的⼦表达式零次或⼀次。

'+' 匹配前⾯的⼦表达式⼀次或多次。

'*' 匹配前⾯的⼦表达式零次或多次。

'|' 指明两项之间的⼀个选择。

例⼦'^([a-z]+|[0-9]+)$'表⽰所有⼩写字母或数字组合成的字符串。

'( )' 标记⼀个⼦表达式的开始和结束位置。

'[]' 标记⼀个中括号表达式。

'{m,n}' ⼀个精确地出现次数范围,m=<出现次数<=n,'{m}'表⽰出现m次,'{m,}'表⽰⾄少出现m次。

/num 匹配 num,其中 num 是⼀个正整数。

对所获取的匹配的引⽤。

字符簇:[[:alpha:]] 任何字母。

oracle 经纬度正则表达式

oracle 经纬度正则表达式

oracle 经纬度正则表达式全文共四篇示例,供读者参考第一篇示例:Oracle是一款非常强大的关系型数据库管理系统,它提供了丰富的功能和工具来支持开发人员进行数据库设计、管理和查询。

正则表达式是一种非常常用的工具,可以用来匹配特定的文本模式。

在Oracle中,我们可以使用正则表达式来处理经纬度数据,例如验证输入是否符合经纬度格式、提取经纬度信息等。

本文将介绍如何在Oracle中使用正则表达式来处理经纬度数据。

一、验证经纬度格式经纬度是地理位置的坐标,通常以度(°)、分(′)、秒(″)表示,例如:40°26′47″,经度和纬度分别在-180度到180度之间。

当我们从用户输入或其他数据源获取经纬度信息时,我们需要验证这些数据的格式是否正确。

在Oracle中,我们可以使用正则表达式来验证经纬度的格式是否合法。

下面是一个简单的例子,我们使用正则表达式来验证经纬度格式是否正确:```sqlSELECT *FROM table_nameWHERE REGEXP_LIKE(latitude, '^[-+]?[0-9]{1,3}\.[0-9]{1,6}')AND REGEXP_LIKE(longitude, '^[-+]?[0-9]{1,3}\.[0-9]{1,6}');```在上面的示例中,我们使用了`REGEXP_LIKE`函数,该函数用于检查一个字符串是否符合指定的正则表达式模式。

正则表达式`^[-+]?[0-9]{1,3}\.[0-9]{1,6}`用于验证经纬度是否符合标准格式。

其中`^`表示匹配字符串的开头,`[-+]?`表示可选的正负号,`[0-9]{1,3}`表示1到3位数字,`\.`表示小数点,`[0-9]{1,6}`表示1到6位数字,``表示匹配字符串的结尾。

二、提取经纬度信息除了验证经纬度格式外,有时我们还需要从文本中提取经纬度信息。

我们可能需要从一个包含经纬度信息的文本中提取出经度和纬度的数值。

oracle的正则表达式应用-课件

oracle的正则表达式应用-课件

IT综合服务提供商 IT综合服务提供商 The Integrated Providers of IT Service
创新、沟通、 创新、沟通、追求卓越 14
Regexp_like的使用方法
• Select * from test_table • Where regexp_like(name,’^[0-9]{1,3}.[09]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)
IT综合服务提供商 IT综合服务提供商 The Integrated Providers of IT Service
创新、沟通、 创新、沟通、追求卓越 11
Regexp_like的用方法
• select * from test_table • where regexp_like(field_1,'[0-9]') • select * from test_table • where regexp_like(field_1,'[A-z]')
IT综合服务提供商 IT综合服务提供商 The Integrated Providers of IT Service
创新、沟通、 创新、沟通、追求卓越 12
Regexp_like的使用方法
• select * from test_table • where regexp_like(name,'[[:alpha:]]') • select * from test_table • where regexp_like(name,'[[:alnum:]]')
IT综合服务提供商 IT综合服务提供商 The Integrated Providers of IT Service

Oracle数据库正则表达式

Oracle数据库正则表达式

Oracle数据库正则表达式正则表达式:⽆论是在前端还是后台正则表达式都是⼀个⾄关重要的知识点,例如判断⼀个⼿机号码输⼊是否正确,如果使⽤Java、C或者其他语⾔进⾏字符串进⾏判断,也许写⼏⼗⾏代码都不⼀定能解决,⽽且漏洞百出,⽽使⽤正则表达式,⼀⾏代码则可轻易解决,下⾯是举例说明正则表达式的⽤法:1: \d 代表⼀个(阿拉伯数字)任意数字 例如:判断⽤户输⼊的是否为11位数字(当然⼿机号码是不能这么简答的表达,只是解释⼀下\d的⽤法)1select'ok'2from dual3where regexp_like('188****5678','\d\d\d\d\d\d\d\d\d\d\d')2: . 代表⼀个(任意字母)任意字母 这⾥需要注意的是,如果输⼊的数字确实需要字母 . 的话,不能直接输 . 要转换⼀下格式,输⼊ \. 即可,这个需要注意。

3: [[:number:]] ⼀个任意数字(可以使⼗六进制) 这个⽤的并不多,如果现实⼗六进制,可以使⽤如下⽅式即可1select'ok'2from dual3where regexp_like('str','[0-9a-fA-F]')4: [[:alpha:]] ⼀个任意⼤⼩写字母5: [ ] 匹配到⽅括号内的其中⼀个字母 ⽅括号中只能匹配到其中的任意⼀个字母,或者是7 或者是8或者是9,只能是1个1select'ok'2from dual3where regexp_like('8','[379]') 例如下⾯的就是ASCII码中,数字3到ASCII码⼩写的 a 其中的任意⼀个字符的匹配1select'ok'2from dual3where regexp_like('9','[3-a]') 当然如果是12345678这样的连续的数字可以这么写1select'ok'2from dual3where regexp_like('str','[1-8]') 如果是要匹配 12345678 中的其中⼀个,或者是字母 a也⾏,就可以这么写,a可以写到前边,也可以写到后⾯,这并⽆所谓,因为只匹配⼀个⽽已1select'ok'2from dual3where regexp_like('str','[a1-8]')6: () 单词匹配 单词匹配,⼀般⽤竖线隔开,例如:⼩明喜欢吃苹果或者⾹蕉或者樱桃,此时就应该是⽤单词的匹配,在圆括号中任选⼀个。

oracle的正则表达式语法

oracle的正则表达式语法

oracle的正则表达式语法Oracle的正则表达式语法正则表达式在计算机编程中是非常重要的,它可以帮助我们轻松地匹配、查找和替换文本中的特定字符序列。

Oracle数据库也支持正则表达式,因此,本文将介绍Oracle的正则表达式语法。

1. 字符类:正则表达式中的字符类可以表示一组字符中的任何一个字符。

在Oracle中,我们可以使用方括号([])来表示字符类,如下所示:[abc]:表示a、b或c中的任何一个字符。

[^abc]:表示除a、b或c以外的任何一个字符。

[a-z]:表示从a到z中的任何一个小写字母。

[A-Z]:表示从A到Z中的任何一个大写字母。

[0-9]:表示从0到9中的任何一个数字。

2. 元字符:正则表达式中的元字符有特殊的含义,可以用来表示空格、数字、特殊字符等。

在Oracle中,我们可以使用以下元字符:\d:表示任何一个数字,等效于[0-9]。

\D:表示除数字以外的任何一个字符,等效于[^0-9]。

\s:表示任何一个空格字符,等效于[ \t\n\r\f\v]。

\S:表示除空格字符以外的任何一个字符。

\w:表示任何一个字母、数字或下划线字符,等效于[a-zA-Z0-9_]。

\W:表示除字母、数字和下划线以外的任何一个字符。

.:表示除换行符以外的任何一个字符。

3. 重复符号:正则表达式中的重复符号可以表示重复出现的字符或字符序列。

在Oracle中,我们可以使用以下重复符号:*:表示重复0次或多次。

+:表示重复1次或多次。

:表示重复0次或1次。

{n}:表示重复n次。

{n,}:表示重复n次或多次。

{n,m}:表示重复n到m次。

4. 边界符号:正则表达式中的边界符号可以表示待查找字符串的边界,如单词的开头或结尾。

在Oracle中,我们可以使用以下边界符号:^:表示字符串的开头。

$:表示字符串的结尾。

\b:表示单词边界,例如字母和空格之间的边界。

\B:表示除单词边界以外的任何一个位置。

5. 分组和反向引用:正则表达式中的分组可以一组字符视为一个整体,并对整个字符组进行操作。

oracle 正则表达式 回车

oracle 正则表达式 回车

主题:Oracle数据库中正则表达式回车的应用正文:一、概述在Oracle数据库中,正则表达式是一种强大的文本匹配工具,可以用来进行复杂的文本搜索和替换操作。

在实际的数据库开发中,经常会遇到需要使用正则表达式进行回车匹配的情况,本文将探讨在Oracle数据库中如何使用正则表达式进行回车匹配操作。

二、正则表达式概述正则表达式是一种用来描述字符串匹配模式的工具。

在Oracle数据库中,可以通过使用REGEXP_相关函数来实现对字符串的正则表达式匹配操作。

在正则表达式中,回车符通常表示为\n,匹配一个回车符的正则表达式可以写为\n。

三、Oracle数据库中的正则表达式函数Oracle数据库中提供了一系列的正则表达式函数,如REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、REGEXP_REPLACE等。

这些函数可以用来实现对字符串的正则表达式匹配、查找、截取和替换操作。

四、使用正则表达式进行回车匹配在Oracle数据库中,可以通过使用正则表达式函数来实现对回车符的匹配操作。

下面通过一个示例来说明如何使用正则表达式进行回车匹配。

示例:假设有一个表t1,其中包含一个字段content,内容如下:"Hello\nWorld\n"需要查询出content字段中包含回车符的记录,可以使用如下SQL语句:SELECT *FROM t1WHERE REGEXP_LIKE(content, '\n');五、正则表达式回车匹配的注意事项在使用正则表达式进行回车匹配时,需要注意一些细节问题:1. 回车符在不同操作系统中表示的方式可能不同,需要根据具体情况来进行调整。

2. Oracle数据库中的正则表达式函数对特殊符号可能有一些限制,需要仔细查阅相关文档来了解具体的用法。

六、总结本文介绍了在Oracle数据库中使用正则表达式进行回车匹配的方法,包括正则表达式的概述、Oracle数据库中的正则表达式函数、以及如何使用正则表达式进行回车匹配的示例。

oracle sql正则表达式

oracle sql正则表达式

oracle sql正则表达式Oracle SQL正则表达式使用`REGEXP_LIKE`和`REGEXP_REPLACE`等函数。

`REGEXP_LIKE`函数用于在查询中应用正则表达式模式匹配。

它的一般语法是:```sqlSELECT column1, column2, ...FROM table_nameWHERE REGEXP_LIKE(column_name, 'pattern', 'start', 'match');```其中,`column_name`是要进行模式匹配的列名,`pattern`是正则表达式模式,`start`是可选的起始位置,`match`是可选的匹配类型。

例如,要查询以数字开头和结尾,长度为7位的字符串,可以使用以下查询:```sqlSELECTFROM fzqWHERE REGEXP_LIKE(value, '^[0-9]{6}[0-9]$');```REGEXP_REPLACE`函数用于在查询中应用正则表达式替换。

它的一般语法是:```sqlSELECT REGEXP_REPLACE(column_name, 'pattern', 'replacement','start', 'count', 'match')FROM table_name;```其中,`column_name`是要进行替换的列名,`pattern`是正则表达式模式,`replacement`是替换字符串,`start`是可选的起始位置,`count`是可选的替换次数,`match`是可选的匹配类型。

例如,要将字符串中的所有数字替换为空字符串,可以使用以下查询:```sqlSELECT REGEXP_REPLACE(column_name, '[0-9]', '', 1, 0, 'i')FROM table_name;```注意:在Oracle SQL中,正则表达式默认是不区分大小写的,如果要进行区分大小写的匹配,可以使用`'i'`作为匹配类型。

Oracle正则表达式使用示例

Oracle正则表达式使用示例

Oracle正则表达式使⽤⽰例正则表达式的基本例⼦ 在使⽤这个新功能之前,您需要了解⼀些元字符的含义。

句号 (.) 匹配⼀个正规表达式中的任意字符(除了换⾏符)。

例如,正规表达式 a.b 匹配的字符串中⾸先包含字母 a,接着是其它任意单个字符(除了换⾏符),再接着是字母 b。

字符串 axb、xaybx 和 abba 都与之匹配,因为在字符串中隐藏了这种模式。

如果您想要精确地匹配以 a 开头和以 b 结尾的⼀条三个字母的字符串,则您必须对正规表达式进⾏定位。

脱字符号 (^) 元字符指⽰⼀⾏的开始,⽽美元符号 ($) 指⽰⼀⾏的结尾(参见表1:附表见第4页)。

因此,正则表达式 ^a.b$ 匹配字符串 aab、abb 或 axb。

将这种⽅式与 LIKE 操作符提供的类似的模式匹配 a_b 相⽐较,其中 (_) 是单字符通配符。

默认情况下,⼀个正则表达式中的⼀个单独的字符或字符列表只匹配⼀次。

为了指⽰在⼀个正则表达式中多次出现的⼀个字符,您可以使⽤⼀个量词,它也被称为重复操作符。

.如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正则表达式看起来像这样:^a.*b$。

* 元字符重复前⾯的元字符 (.) 指⽰的匹配零次、⼀次或更多次。

LIKE 操作符的等价的模式是 a%b,其中⽤百分号 (%) 来指⽰任意字符出现零次、⼀次或多次。

表 2 给出了重复操作符的完整列表。

注意它包含了特殊的重复选项,它们实现了⽐现有的 LIKE 通配符更⼤的灵活性。

如果您⽤圆括号括住⼀个表达式,这将有效地创建⼀个可以重复⼀定次数的⼦表达式。

例如,正则表达式 b(an)*a 匹配 ba、bana、banana、yourbananasplit 等。

Oracle 的正则表达式实施⽀持 POSIX (可移植操作系统接⼝)字符类,参见表 3 中列出的内容。

这意味着您要查找的字符类型可以⾮常特别。

假设您要编写⼀条仅查找⾮字母字符的 LIKE 条件 — 作为结果的 WHERE ⼦句可能不经意就会变得⾮常复杂。

oracle中运用正则表达式

oracle中运用正则表达式

[[:xdigit:]] 任何 16 进制的数字,相当于[0-9a-fA-F]。 各种操作符的运算优先级 \转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, anymetacharacter 位置和顺序 | */ --创建表 create table fzq ( id varchar(4), value varchar(10) ); --数据插入 insert into fzq values ('1','1234560'); insert into fzq values ('2','1234560'); insert into fzq values ('3','1b3b560'); insert into fzq values ('4','abc'); insert into fzq values ('5','abcde'); insert into fzq values ('6','ADREasx'); insert into fzq values ('7','123 45'); insert into fzq values
ORACLE 中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与 LIKE 的功能相似 2,REGEXP_INSTR :与 INSTR 的功能相似 3,REGEXP_SUBSTR :与 SUBSTR 的功能相似 4,REGEXP_REPLACE :与 REPLACE 的功能相似 它们在用法上与 Oracle SQL 函数 LIKE、INSTR、SUBSTR 和 REPLACE 用法相同, 但是它们使用 POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。 POSIX 正则表达式由标准的元字符(metacharacters)所构成: '^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。 '$' 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹 配 '\n' 或 '\r'。 '.' 匹配除换行符之外的任何单字符。 '?' 匹配前面的子表达式零次或一次。 '+' 匹配前面的子表达式一次或多次。 '*' 匹配前面的子表达式零次或多次。 '|' 指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的 字符串。 '( )' 标记一个子表达式的开始和结束位置。 '[]' 标记一个中括号表达式。 '{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现 m 次,'{m,}'表示至少 出现 m 次。 \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。 字符簇: [[:alpha:]] 任何字母。 [[:digit:]] 任何数字。 [[:alnum:]] 任何字母和数字。 [[:space:]] 任何白字符。 [[:upper:]] 任何大写字母。 [[:lower:]] 任何小写字母。 [[:punct:]] 任何装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电通,力1根保过据护管生高线产中0不工资仅艺料可高试以中卷解资配决料置吊试技顶卷术层要是配求指置,机不对组规电在范气进高设行中备继资进电料行保试空护卷载高问与中题带资2负料2,荷试而下卷且高总可中体保资配障料置2试时32卷,3各调需类控要管试在路验最习;大题对限到设度位备内。进来在行确管调保路整机敷使组设其高过在中程正资1常料中工试,况卷要下安加与全强过,看度并25工且52作尽22下可护都能1关可地于以缩管正小路常故高工障中作高资;中料对资试于料卷继试连电卷接保破管护坏口进范处行围理整,高核或中对者资定对料值某试,些卷审异弯核常扁与高度校中固对资定图料盒纸试位,卷置编工.写况保复进护杂行层设自防备动腐与处跨装理接置,地高尤线中其弯资要曲料避半试免径卷错标调误高试高等方中,案资要,料求编试技5写、卷术重电保交要气护底设设装。备备置管4高调、动线中试电作敷资高气,设料中课并技3试资件且、术卷料中拒管试试调绝路包验卷试动敷含方技作设线案术,技槽以来术、及避管系免架统不等启必多动要项方高方案中式;资,对料为整试解套卷决启突高动然中过停语程机文中。电高因气中此课资,件料电中试力管卷高壁电中薄气资、设料接备试口进卷不行保严调护等试装问工置题作调,并试合且技理进术利行,用过要管关求线运电敷行力设高保技中护术资装。料置线试做缆卷到敷技准设术确原指灵则导活:。。在对对分于于线调差盒试动处过保,程护当中装不高置同中高电资中压料资回试料路卷试交技卷叉术调时问试,题技应,术采作是用为指金调发属试电隔人机板员一进,变行需压隔要器开在组处事在理前发;掌生同握内一图部线纸故槽资障内料时,、,强设需电备要回制进路造行须厂外同家部时出电切具源断高高习中中题资资电料料源试试,卷卷线试切缆验除敷报从设告而完与采毕相用,关高要技中进术资行资料检料试查,卷和并主检且要测了保处解护理现装。场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

oracle正则表达式用法

oracle正则表达式用法

Oracle正则表达式基于Perl语言的正则表达式语法,其基本语法和使用方法如下:1. 字符匹配:* .:匹配除了换行外的任意一个字符。

* \d:匹配任何数字,相当于[0-9]。

* \D:匹配任何非数字字符,相当于[^0-9]。

* \w:匹配任何字母数字字符或下划线,相当于[a-zA-Z0-9_]。

* \W:表示匹配任何非字母数字字符或下划线,相当于[^a-zA-Z0-9_]。

2. 限定符:* *:匹配前一个字符出现0次或多次。

* +:匹配前一个字符出现1次或多次。

* ?:匹配前一个字符出现0次或1次。

* {n}:匹配前一个字符出现n次。

* {n,}:匹配前一个字符出现n次或更多。

* {n,m}:匹配前一个字符出现n~m次。

3. 边界匹配:* ^:匹配开始位置。

* $:匹配结束位置。

* \b:匹配单词边界,即单词的开头或结尾位置。

* \B:匹配非单词边界,即不是单词的开头或结尾位置。

4. 分组和引用:* ( ):分组,标记一个子表达式的开始和结束位置。

* \num:引用第num个子表达式,num从1开始。

5. 字符集合:[]表示一组字符中的任意一个。

6. 转义符:\表示转义一个字符。

7. 其他高级语法支持:贪婪匹配、非贪婪匹配、零宽断言(zero-width assertion)、后向引用(backreference)、捕获组等。

另外,Oracle 10g支持正则表达式的四个新函数分别是REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR和REGEXP_REPLACE,它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。

请注意,具体使用方法可能因不同的数据库版本或应用场景而有所不同。

建议查阅Oracle官方文档或相关教程以获取更详细和准确的信息。

oracle regexp_like用法

oracle regexp_like用法

oracle regexp_like用法Oracle的regexp_like函数是用来进行正则表达式匹配,用法如下:1. regexp_like函数的语法为:regexp_like(source_string, pattern [, match_parameter])2. source_string是要匹配的源字符串。

3. pattern是一个正则表达式模式,用来定义匹配的规则。

4. match_parameter是一个可选参数,用来指定匹配的选项。

常用的正则表达式模式和匹配选项如下:1. 正则表达式模式:- 简单字符: 可以直接匹配常规字符,如'a', 'b'。

- 字符集: 使用方括号[]定义一个字符集,如'[abc]'可以匹配字符'a','b', 或'c'。

- 字符范围: 可以在字符集中使用连字符- 指定范围,如'[a-z]'匹配小写字母。

- 通配符: 使用句点.匹配任意单个字符。

- 重复次数: 使用花括号{}指定重复次数,如'a{3}'匹配连续三个'a'。

- 转义字符: 使用反斜杠\来转义特殊字符,如'\.'匹配句点字符。

- 预定义字符集: 使用特殊字符集来匹配特定类型的字符,如'\d'匹配数字字符,'\s'匹配空白字符,'\w'匹配单词字符。

- 边界匹配符: '^'匹配字符串的起始位置,''匹配字符串的结束位置。

2. 匹配选项:- 'c':大小写不敏感的匹配。

- 'i':区分大小写的匹配。

- 'm':多行模式,'^'和''能够匹配行的开始和结束位置。

- 'n':禁止'.' 字符匹配换行符。

[原]在Oracle中使用正则表达式

[原]在Oracle中使用正则表达式

[原]在Oracle中使⽤正则表达式Oracle使⽤正则表达式离不开这4个函数:1。

regexp_like2。

regexp_substr3。

regexp_instr4。

regexp_replace看函数名称⼤概就能猜到有什么⽤了。

regexp_like 只能⽤于条件表达式,和 like 类似,但是使⽤的正则表达式进⾏匹配,语法很简单:regexp_substr 函数,和 substr 类似,⽤于拾取合符正则表达式描述的字符⼦串,语法如下:regexp_instr 函数,和 instr 类似,⽤于标定符合正则表达式的字符⼦串的开始位置,语法如下:regexp_replace 函数,和 replace 类似,⽤于替换符合正则表达式的字符串,语法如下:这⾥解析⼀下⼏个参数的含义:1。

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

2。

pattern,正则表达式。

3。

match_parameter,匹配选项。

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

4。

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

5。

occurrence,标识第⼏个匹配组。

6。

replace_string,替换的字符串。

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

create table tmp aswith data as (select 'like' as id ,'a9999' as str from dual union allselect 'like' ,'a9c' from dual union allselect 'like' ,'A7007' from dual union allselect 'like' ,'123a34cc' from dual union allselect 'substr' ,'123,234,345' from dual union allselect 'substr' ,'12,34.56:78' from dual union allselect 'substr' ,'123456789' from dual union allselect 'instr' ,'192.168.0.1' from dual union allselect 'replace' ,'(020)12345678' from dual union allselect 'replace' ,'001517729C28' from dual)select * from data ;select * from tmp ;ID STR------- -------------like a9999like a9clike A7007like 123a34ccsubstr 123,234,345substr 12,34.56:78substr 123456789instr 192.168.0.1replace (020)12345678replace 001517729C28regexp_like 例⼦:select str from tmp where id='like' and regexp_like(str,'A\d+','i'); -- 'i' 忽略⼤⼩写STR-------------a9999a9cA7007123a34ccselect str from tmp where id='like' and regexp_like(str, 'a\d+');STR-------------a9999a9c123a34ccselect str from tmp where id='like' and regexp_like(str,'^a\d+');STR-------------a9999a9cselect str from tmp where id='like' and regexp_like(str,'^a\d+$');STR-------------a9999regexp_substr 例⼦:col str format a15;selectstr,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 tmpwhere id='substr';STR STR STR STR STR--------------- --------------- --------------- --------------- ---------------123,234,345 123 123 234 2312,34.56:78 12 12 34.56:78 2123456789 123456789 123456789 23456789selectstr,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) strfrom tmpwhere id='substr';STR STR STR STR STR--------------- --------------- --------------- --------------- ---------------123,234,345 1 123 23 23412,34.56:78 1 12 34123456789 1 123456789 34 234select regexp_substr('123456789','\d',1,level) str --取出每位数字,有时这也是⾏转列的⽅式from dualconnect by level<=9STR---------------123456789regex_instr 例⼦:col ind format 9999;selectstr,regexp_instr(str,'\.' ) ind ,regexp_instr(str,'\.',1,2) ind ,regexp_instr(str,'\.',5,2) indfrom tmp where id='instr';STR IND IND IND--------------- ----- ----- -----192.168.0.1 4 8 10selectregexp_instr('192.168.0.1','\.',1,level) ind , -- 点号. 所在的位置regexp_instr('192.168.0.1','\d',1,level) ind -- 每个数字的位置from dualconnect by level <= 9IND IND----- -----4 18 210 30 50 60 70 90 110 0regex_replace 例⼦:selectstr,regexp_replace(str,'020','GZ') str,regexp_replace(str,'(\d{3})(\d{3})','<\2\1>') str -- 将第⼀、第⼆捕获组交换位置,⽤尖括号标识出来from tmpwhere id='replace';STR STR STR--------------- --------------- ---------------(020)12345678 (GZ)12345678 (020)<456123>78001517729C28 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 colfrom sudokuconnect 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_linefrom tmpROW_LINE------------------------------0 2 0 0 0 0 0 8 05 6 8 1 7 9 2 3 40 9 0 0 0 0 0 1 00 3 0 0 4 0 0 5 00 4 0 2 0 5 0 9 00 7 0 0 8 0 0 4 00 5 0 0 0 0 0 6 02 8 9 634 1 7 50 1 0 0 0 0 0 2 0。

Oracle中正则表达式的使用实例教程

Oracle中正则表达式的使用实例教程

Oracle中正则表达式的使⽤实例教程前⾔正则表达式已经在很多软件中得到⼴泛的应⽤,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境。

本⽂主要介绍了关于Oracle中正则表达式的使⽤⽅法,下⾯话不多说了,来⼀起看看详细的介绍。

Oracle使⽤正则表达式离不开这4个函数:regexp_like、regexp_substr、regexp_instr、regexp_replace。

regexp_like该函数只能⽤于条件表达式,和 like 类似,但是使⽤的正则表达式进⾏匹配//查询所有包含⼩写字母或者数字的记录。

select * from fzq where regexp_like(value,'^([a-z]+|[0-9]+)$');regexp_substr该函数和 substr 类似,⽤于拾取合符正则表达式描述的字符⼦串,该函数的定义如下function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)- String 输⼊的字符串- pattern 正则表达式- position 标识从第⼏个字符开始正则表达式匹配。

(默认为1)- occurrence 标识第⼏个匹配组。

(默认为1)- modifier 取值范围:i:⼤⼩写不敏感;c:⼤⼩写敏感;n:点号 . 不匹配换⾏符号;m:多⾏模式;x:扩展模式,忽略正则表达式中的空⽩字符。

下⾯是⼀些实例--检索中间的数字SELECT REGEXP_SUBSTR(a,'[0-9]+') FROM test_reg_substr WHERE REGEXP_LIKE(a, '[0-9]+');--检索中间的数字(从第⼀个字母开始匹配,找第2个匹配项⽬)SELECT NVL(REGEXP_SUBSTR(a,'[0-9]+',1, 2), '-') AS a FROM test_reg_substrWHERE REGEXP_LIKE(a, '[0-9]+');regexp_instr该函数和 instr 类似,⽤于标定符合正则表达式的字符⼦串的开始位置,Oracle数据库中的REGEXP_INSTR函数的语法是REGEXP_INSTR (source_char, pattern [, position [, occurrence[, return_option [, match_parameter ] ] ] ] )- source_char 搜索值的字符表达式- pattern 正则表达式- position 可选。

orcl中用正则表达式

orcl中用正则表达式

orcl中用正则表达式在Oracle中,你可以使用正则表达式来执行各种字符串操作,例如搜索、替换、提取等。

Oracle的正则表达式功能主要通过`REGEXP_SUBSTR`、`REGEXP_INSTR`、`REGEXP_REPLACE`等函数提供。

以下是一些在Oracle中使用正则表达式的示例:1. 使用`REGEXP_SUBSTR`提取字符串假设你想从某个字符串中提取所有的数字:```sqlSELECT REGEXP_SUBSTR('abc123def456', '[0-9]+') FROM dual;```这会返回`123`和`456`。

2. 使用`REGEXP_INSTR`查找字符串查找某个字符串在另一个字符串中的位置:```sqlSELECT REGEXP_INSTR('abc123def456', '[0-9]+') FROM dual;```这会返回数字`4`,表示第一个数字(123)开始于位置4。

3. 使用`REGEXP_REPLACE`替换字符串替换所有匹配正则表达式的子串:```sqlSELECT REGEXP_REPLACE('abc123def456', '[0-9]+', 'XX') FROM dual;```这会返回`abcXXdefXX`。

4. 使用复杂的正则表达式例如,如果你想从字符串中提取所有由字母组成的子串:```sqlSELECT REGEXP_SUBSTR('abc123def456', '[a-zA-Z]+') FROM dual;```这会返回`abc`和`def`。

5. 分组和捕获使用括号进行分组和捕获:```sqlSELECT REGEXP_SUBSTR('abc123def456', '([a-z]+)([0-9]+)', 1, 1, NULL, 1) FROM dual;```这将返回`abc`,因为它是第一个匹配的子串。

Oracle正则表达式语法与应用

Oracle正则表达式语法与应用
正则表达式主要由普通字符和元字符组成
(例如:’^1[3-8][0-9]{9}$’)
普通字符
包括所有的大小写字母、数字以及一些标点符号
元字符(特殊字符)
就是一些有特殊含义的字符,例如 ^ 代表匹配输入字 符串的开始位置(在[]中表示否定),$ 代表匹配输入 字符串的结束位置
常用元字符
. 匹配除换行符之外的任何单字符
查询value中以1开头60结束的记录,并且长度是7位,
并且全部是数字(使用like就不好实现了)
select * from test where regexp_like(value,'1[0-9]{4}60'); 或者使用字符类:'1[[:digit:]]{4}60'
Regexp_like实例应用二
Regexp_like实例应用一
查询value中以1开头60结尾的记录,并且长度是7位 select * from test where value like ‘1____60’; select * from test where regexp_like(values,’1….60’);
(这种简单查询两种方式都能简单实现)
正则表达式概述
定义:
正则表达式是对字符串操作的一种逻辑公式,就 是用事先定义好的一些特定字符组合成一个“规则字 符串”,这个“规则字符串”可以用来检索符合这个 规则的其他字符串。 特点: 一、灵活性和功能性非常强 二、可用简单方式达到字符串的复杂控制 三、对于刚接触的人来说,比较晦涩难懂
正则表达式的组成
Oracle中的正则表达式
Oracle 的正规表达式还支持 POSIX字符类。这意味着
要查找的字符类型可以非常特别。例如要查找不含字 母的字符串,如果用like的话可能非常复杂,但正则 表达式可以轻松解决(‘^[^[:alpha:]]+$’)。 POSIX 字符类必须包含在一个由方括号 ([]) 指示的字 符列表中。例如,正规表达式 [[:lower:]] 匹配一个小 写字母字符,而 [[:lower:]]{5} 匹配五个连续的小写字 母字符。

oracle sql 年月正则表达式

oracle sql 年月正则表达式

Oracle SQL中的年月正则表达式是指能够匹配特定格式的年月信息的正则表达式。

在实际的数据处理中,经常需要对年月信息进行提取、比较、筛选等操作,而正则表达式正是一个强大的工具,能够帮助我们轻松地处理这些任务。

1. 年月正则表达式的基本结构在Oracle SQL中,用于匹配年月信息的正则表达式的基本结构是由数字和特定的分隔符组成的。

一般而言,年月信息的格式可以是"yyyy-mm"、"yyyy/mm"、"yyyymm"等形式,因此我们需要编写相应的正则表达式来进行匹配。

2. 匹配四位年份和两位月份如果我们需要匹配的年月信息的格式是"yyyy-mm",那么对应的正则表达式可以是"\b\d{4}-\d{2}\b"。

其中,"\b"表示单词边界,"\d"表示数字,"{4}"表示恰好匹配4个数字,"-"表示匹配连字符,"{2}"表示恰好匹配2个数字。

3. 匹配四位年份和两位月份如果我们需要匹配的年月信息的格式是"yyyy/mm",那么对应的正则表达式可以是"\b\d{4}/\d{2}\b"。

其中,"\b"表示单词边界,"\d"表示数字,"{4}"表示恰好匹配4个数字,"/"表示匹配斜杠,"{2}"表示恰好匹配2个数字。

4. 匹配六位年份和两位月份如果我们需要匹配的年月信息的格式是"yyyymm",那么对应的正则表达式可以是"\b\d{6}\d{2}\b"。

其中,"\b"表示单词边界,"\d"表示数字,"{6}"表示恰好匹配6个数字,"{2}"表示恰好匹配2个数字。

Oracle正则表达式的用法

Oracle正则表达式的用法

Oracle正则表达式的用法正则表达式具有强大、便捷、高效的文本处理功能。

能够添加、删除、分析、叠加、插入和修整各种类型的文本和数据。

Oracle从10g开始支持正则表达式一、Oracle预定义的 POSIX 字符类字符类说明[:alpha:]字母字符[:lower:]小写字母字符[:upper:]大写字母字符[:digit:]数字[:alnum:]字母数字字符[:spac e:]空白字符(禁止打印),如回车符、换行符、竖直制表符和换页符[:punct:]标点字符[:cntrl:]控制字符(禁止打印)[:print:]可打印字符[:alnum:]字母和数字混合的字符二、正则表达式运算符和函数1、REGEXP_SUBSTRREGEXP_SUBSTR为指定字符串的一部分与正则表达式建立匹配。

语法如下:REGEXP_SUBSTR(source_string,pattern,start_position,occurrence,match_parameter)说明其中source_string是必须的。

可以是带引号的字符串或者变量。

Pattern是用单引号引用的与正则表达式。

Start_position指定了在字符串中的准确位置,默认值为1。

Occurrence是一个选项,指定在源字符串匹配过程中相对其他字符串,哪个字符串应该匹配。

最后,match_parameter也是一个选项,指定在匹配时是否区分大水写。

实例(1)、返回从ename的第二个位置开始查找,并且是以“L”开头到结尾的字串SQL> select regexp_substr(ename,'L.*','2') substr from emp;(2)、SELECT REGEXP_SUBSTR(mc,'[a-z]+') FROM test;SELECT REGEXP_SUBSTR(mc,'[0-9]+') FROM test;SELECT REGEXP_SUBSTR('aababcde','^a.*b') FROM DUAL;(3)、SQL 代码复制DECLARE V_RESULT VARCHAR2(255); BEGIN--返回‘light’SELECT REGEXP_SUBSTR('But, soft! What light through yonder window breaks?','l[[:alpha:]]{4}') INTO V_RESULT FROM DUAL;DBMS_OUTPUT.PUT_LINE(V_RESULT); END;2、REGEXP_INSTRREGEXP_INSTR返回与正则表达式匹配的字符和字符串的位置。

oracle数据库正则表达式写法

oracle数据库正则表达式写法

在数据库的查询和数据处理中,正则表达式(Regular Expression)是一个非常有用的工具。

在Oracle数据库中,正则表达式写法可以帮助我们更灵活、高效地进行数据的匹配和处理。

本文将从简到繁地探讨Oracle数据库正则表达式写法,以帮助读者更深入地理解并灵活应用这一特性。

1. 正则表达式概述正则表达式是一种用来描述字符串模式的工具,它可以帮助我们在文本中进行搜索、匹配和替换操作。

在Oracle数据库中,正则表达式的写法可以极大地扩展我们的数据处理能力,使得数据的查询和操作更加灵活和高效。

2. 基本正则表达式写法在Oracle数据库中,我们可以使用正则表达式进行模式匹配。

我们可以使用'^'来匹配以某个字符开头的字符串,使用'$'来匹配以某个字符结尾的字符串。

还可以使用'.'来匹配任意单个字符,使用'*'来匹配前面的字符零次或多次,使用'+'来匹配前面的字符一次或多次。

3. 高级正则表达式写法除了基本的正则表达式写法外,Oracle数据库还支持一些高级的正则表达式写法。

我们可以使用'\d'来匹配数字字符,使用'\w'来匹配单词字符,使用'\s'来匹配空白字符。

还可以使用'[]'来指定字符集,使用'|'来表示或的关系,使用'()'来分组表达式等。

4. 实际应用示例为了更好地理解Oracle数据库正则表达式的写法,我们可以通过一些实际的应用示例来加深印象。

我们可以使用正则表达式来提取文本中的通信方式号码、电流信箱位置区域等信息;也可以使用正则表达式来对文本中的特定模式进行替换或过滤等操作。

通过这些实际应用示例,我们可以更直观地感受到正则表达式在数据处理中的强大功能。

5. 个人观点和总结对于我个人来说,正则表达式是数据库查询和数据处理中非常重要的一部分。

Oracle正则表达式使用介绍

Oracle正则表达式使用介绍

Oracle正则表达式使⽤介绍下⾯通过⼀些例⼦来说明使⽤正则表达式来处理⼀些⼯作中常见的问题。

1.REGEXP_SUBSTRREGEXP_SUBSTR 函数使⽤正则表达式来指定返回串的起点和终点,返回与source_string 字符集中的VARCHAR2 或CLOB 数据相同的字符串。

语法:--1.REGEXP_SUBSTR与SUBSTR函数相同,返回截取的⼦字符串REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]])注:srcstr源字符串pattern正则表达式样式position开始匹配字符位置occurrence匹配出现次数match_option匹配选项(区分⼤⼩写)1.1从字符串中截取⼦字符串SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM dual;Output: 1PSN[[:alnum:]]+ 表⽰匹配1个或者多个字母或数字字符。

SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM dual;Output: 231与上⾯⼀个例⼦相⽐,多了两个参数1表⽰从源字符串的第⼀个字符开始查找匹配2表⽰第2次匹配到的字符串(默认值是“1”,如上例)select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual;Output: 231@* 表⽰匹配0个或者多个@[[:alnum:]]+ 表⽰匹配1个或者多个字母或数字字符注意:需要注意“+”和“*”的区别select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual;Output: @@+ 表⽰匹配1个或者多个@[[:alnum:]]* 表⽰匹配0个或者多个字母或数字字符select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;Output: Null@+ 表⽰匹配1个或者多个@[[:alnum:]]+ 表⽰匹配1个或者多个字母或数字字符select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;Output: 125[[:digit:]]+$ 表⽰匹配1个或者多个数字结尾的字符select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from dual;Output: /ABc[^[:digit:]]+$ 表⽰匹配1个或者多个不是数字结尾的字符selectregexp_substr('*******************','[^@]+')fromdual;Output: Tom_Kyte[^@]+ 表⽰匹配1个或者多个不是“@”的字符select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2)from dual;Output: Null[[:alnum:]]* 表⽰匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这⾥第2次匹配的是“/”(匹配了0次),⽽不是“231”,所以结果是“Null”1.2匹配重复出现查找连续2个⼩写字母SELECT regexp_substr('Republicc Of Africaa', '([a-z])\1', 1, 1, 'i')FROM dual;Output: cc([a-z])表⽰⼩写字母a-z\1表⽰匹配前⾯的字符的连续次数1表⽰从源字符串的第1个字符开始匹配1第1次出现符合匹配结果的字符i表⽰区分⼤⼩写1.3其他⼀些匹配样式查找⽹页地址信息SELECT regexp_substr('Go to /products and click on database', 'http://([[:alnum:]]+\.?){3,4}/?') RESULT FROM dualOutput: 其中:http://表⽰匹配字符串“http://”([[:alnum:]]+\.?) 表⽰匹配1次或者多次字母或数字字符,紧跟0次或1次逗号符{3,4}表⽰匹配前⾯的字符最少3次,最多4次/?表⽰匹配⼀个反斜杠字符0次或者1次提取csv字符串中的第三个值SELECT regexp_substr('1101,Yokohama,Japan,1.5.105', '[^,]+', 1, 3) AS outputFROM dual;Output: Japan其中:[^,]+表⽰匹配1个或者多个不是逗号的字符1表⽰从源字符串的第⼀个字符开始查找匹配3表⽰第3次匹配到的字符串注:这个通常⽤来实现字符串的列传⾏--字符串的列传⾏SELECT regexp_substr('1101,Yokohama,Japan,1.5.105', '[^,]+', 1, LEVEL) AS outputFROM dualCONNECT BY LEVEL <= length('1101,Yokohama,Japan,1.5.105') -length(REPLACE('1101,Yokohama,Japan,1.5.105', ',')) + 1;Output: 1101YokohamaJapan1.5.105这⾥通过LEVEL来循环截取匹配到的字符串。

Oracle中的正则表达式

Oracle中的正则表达式

Oracle中的正则表达式Oracle使⽤正则表达式离不开这4个函数:1 、regexp_like2 、regexp_substr3、 regexp_instr4 、regexp_replace2.1、REGEXP_SUBSTRREGEXP_SUBSTR函数使⽤正则表达式来指定返回串的起点和终点。

语法:regexp_substr(source_string,pattern[,position[,occurrence[,match_parameter]]])source_string:源串,可以是常量,也可以是某个值类型为串的列。

position:从源串开始搜索的位置。

默认为1。

occurrence:指定源串中的第⼏次出现。

默认值1.match_parameter:⽂本量,进⼀步订制搜索,取值如下:'i' ⽤于不区分⼤⼩写的匹配。

'c' ⽤于区分⼤⼩写的匹配。

'n' 允许将句点“.”作为通配符来匹配换⾏符。

如果省略改参数,句点将不匹配换⾏符。

'm' 将源串视为多⾏。

即将“^”和“$”分别看做源串中任意位置任意⾏的开始和结束,⽽不是看作整个源串的开始或结束。

如果省略该参数,源串将被看作⼀⾏来处理。

如果取值不属于上述中的某个,将会报错。

如果指定了多个互相⽭盾的值,将使⽤最后⼀个值。

如'ic'会被当做'c'处理。

省略该参数时:默认区分⼤⼩写、句点不匹配换⾏符、源串被看作⼀⾏。

例⼦:1. select regexp_substr('MY INFO: Anxpp,23,and boy','[[:digit:]]',1,2) from users;结果:此处会返回3。

注意这⾥同时⽤到了“[]”和“[:digit:]”。

2.2、REGEXP_INSTRREGEXP_INSTR函数使⽤正则表达式返回搜索模式的起点和终点(整数)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用正规表达式编写更好的SQL作者:Alice RischertOracle Database 10g 中的正规表达式特性是一个用于处理文本数据的强大工具Oracle Database 10g 的一个新特性大大提高了您搜索和处理字符数据的能力。

这个特性就是正规表达式,是一种用来描述文本模式的表示方法。

很久以来它已在许多编程语言和大量UNIX 实用工具中出现过了。

Oracle 的正规表达式的实施是以各种SQL 函数和一个WHERE 子句操作符的形式出现的。

如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能。

已经对正规表达式很熟悉的读者可以了解如何在Oracle SQL 语言的环境中应用这种功能。

什么是正规表达式?正规表达式由一个或多个字符型文字和/或元字符组成。

在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式cat。

它被读作字母c,接着是字母a 和t,这种模式匹配cat、location 和catalog 之类的字符串。

元字符提供算法来确定Oracle 如何处理组成一个正规表达式的字符。

当您了解了各种元字符的含义时,您将体会到正规表达式用于查找和替换特定的文本数据是非常强大的。

验证数据、识别重复关键字的出现、检测不必要的空格,或分析字符串只是正规表达式的许多应用中的一部分。

您可以用它们来验证电话号码、邮政编码、电子邮件地址、社会安全号码、IP 地址、文件名和路径名等的格式。

此外,您可以查找如HTML 标记、数字、日期之类的模式,或任意文本数据中符合任意模式的任何事物,并用其它的模式来替换它们。

用Oracle Database 10g 使用正规表达式您可以使用最新引进的Oracle SQL REGEXP_LIKE 操作符和REGEXP_INSTR、REGEXP_SUBSTR 以及REGEXP_REPLACE 函数来发挥正规表达式的作用。

您将体会到这个新的功能如何对LIKE 操作符和INSTR、SUBSTR 和REPLACE 函数进行了补充。

实际上,它们类似于已有的操作符,但现在增加了强大的模式匹配功能。

被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。

正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性。

正规表达式的基本例子在使用这个新功能之前,您需要了解一些元字符的含义。

句号(.) 匹配一个正规表达式中的任意字符(除了换行符)。

例如,正规表达式 a.b 匹配的字符串中首先包含字母a,接着是其它任意单个字符(除了换行符),再接着是字母b。

字符串axb、xaybx 和abba 都与之匹配,因为在字符串中隐藏了这种模式。

如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串,则您必须对正规表达式进行定位。

脱字符号(^) 元字符指示一行的开始,而美元符号($) 指示一行的结尾(参见表1)。

因此,正规表达式^a.b$ 匹配字符串aab、abb 或axb。

将这种方式与LIKE ‘a_b’提供的类似的模式匹配a_b 相比较,其中(_) 是单字符通配符。

默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次。

为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复操作符。

.如果您想要得到从字母 a 开始并以字母b 结束的匹配模式,则您的正规表达式看起来像这样:^a.*b$。

* 元字符重复前面的元字符(.) 指示的匹配零次、一次或更多次。

LIKE 操作符的等价的模式是a%b,其中用百分号(%) 来指示任意字符出现零次、一次或多次。

表2 给出了重复操作符的完整列表。

注意它包含了特殊的重复选项,它们实现了比现有的LIKE 通配符更大的灵活性。

如果您用圆括号括住一个表达式,这将有效地创建一个可以重复一定次数的子表达式。

例如,正规表达式b(an)*a 匹配ba、bana、banana、yourbananasplit 等。

Oracle 的正规表达式实施支持POSIX (可移植操作系统接口)字符类,参见表3 中列出的内容。

这意味着您要查找的字符类型可以非常特别。

假设您要编写一条仅查找非字母字符的LIKE 条件—作为结果的WHERE 子句可能不经意就会变得非常复杂。

POSIX 字符类必须包含在一个由方括号([]) 指示的字符列表中。

例如,正规表达式[[:lower:]] 匹配一个小写字母字符,而[[:lower:]]{5} 匹配五个连续的小写字母字符。

除POSIX 字符类之外,您可以将单独的字符放在一个字符列表中。

例如,正规表达式^ab[cd]ef$ 匹配字符串abcef 和abdef。

必须选择c 或d。

除脱字符(^) 和连字符(-) 之外,字符列表中的大多数元字符被认为是文字。

正规表达式看起来很复杂,这是因为一些元字符具有随上下文环境而定的多重含义。

^ 就是这样一种元字符。

如果您用它作为一个字符列表的第一个字符,它代表一个字符列表的非。

因此,[^[:digit:]] 查找包含了任意非数字字符的模式,而^[[:digit:]] 查找以数字开始的匹配模式。

连字符(-) 指示一个范围,正规表达式[a-m] 匹配字母a 到字母m 之间的任意字母。

但如果它是一个字符行中的第一个字符(如在[-afg] 中),则它就代表连字符。

之前的一个例子介绍了使用圆括号来创建一个子表达式;它们允许您通过输入更替元字符来输入可更替的选项,这些元字符由竖线(|) 分开。

例如,正规表达式t(a|e|i)n 允许字母t 和n 之间的三种可能的字符更替。

匹配模式包括如tan、ten、tin 和Pakistan 之类的字,但不包括teen、mountain 或tune。

作为另一种选择,正规表达式t(a|e|i)n 也可以表示为一个字符列表t[aei]n。

表4 汇总了这些元字符。

虽然存在更多的元字符,但这个简明的概述足够用来理解这篇文章使用的正规表达式。

REGEXP_LIKE 操作符REGEXP_LIKE 操作符向您介绍在Oracle 数据库中使用时的正规表达式功能。

表 5 列出了REGEXP_LIKE 的语法。

下面的SQL 查询的WHERE 子句显示了REGEXP_LIKE 操作符,它在ZIP 列中搜索满足正规表达式[^[:digit:]] 的模式。

它将检索ZIPCODE 表中的那些ZIP 列值包含了任意非数字字符的行。

SELECT zipFROM zipcodeWHERE REGEXP_LIKE(zip, '[^[:digit:]]')ZIP-----ab123123xy007ababcxy这个正规表达式的例子仅由元字符组成,更具体来讲是被冒号和方括号分隔的POSIX 字符类digit。

第二组方括号(如[^[:digit:]] 中所示)包括了一个字符类列表。

如前文所述,需要这样做是因为您只可以将POSIX 字符类用于构建一个字符列表。

REGEXP_INSTR 函数这个函数返回一个模式的起始位置,因此它的功能非常类似于INSTR 函数。

新的REGEXP_INSTR 函数的语法在表 6 中给出。

这两个函数之间的主要区别是,REGEXP_INSTR 让您指定一种模式,而不是一个特定的搜索字符串;因而它提供了更多的功能。

接下来的示例使用REGEXP_INSTR 来返回字符串Joe Smith, 10045 Berry Lane, San Joseph, CA 91234 中的五位邮政编码模式的起始位置。

如果正规表达式被写为[[:digit:]]{5},则您将得到门牌号的起始位置而不是邮政编码的,因为10045 是第一次出现五个连续数字。

因此,您必须将表达式定位到该行的末尾,正如$ 元字符所示,该函数将显示邮政编码的起始位置,而不管门牌号的数字个数。

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234','[[:digit:]]{5}$')AS rx_instrFROM dualRX_INSTR----------45编写更复杂的模式让我们在前一个例子的邮政编码模式上展开,以便包含一个可选的四位数字模式。

您的模式现在可能看起来像这样:[[:digit:]]{5}(-[[:digit:]]{4})?$。

如果您的源字符串以5 位邮政编码或5 位+ 4 位邮政编码的格式结束,则您将能够显示该模式的起始位置。

SELECT REGEXP_INSTR('Joe Smith, 10045 Berry Lane, San Joseph, CA 91234-1234',' [[:digit:]]{5}(-[[:digit:]]{4})?$')AS starts_atFROM dualSTARTS_AT----------44在这个示例中,括弧里的子表达式(-[[:digit:]]{4}) 将按? 重复操作符的指示重复零次或一次。

此外,企图用传统的SQL 函数来实现相同的结果甚至对SQL 专家也是一个挑战。

为了更好地说明这个正规表达式示例的不同组成部分,表7 包含了一个对单个文字和元字符的描述。

REGEXP_SUBSTR 函数·Ç³£ÀàËÆÓÚSUBSTR 函数的REGEXP_SUBSTR 函数用来提取一个字符串的一部分。

表8 显示了这个新函数的语法。

在下面的示例中,匹配模式[^,]* 的字符串将被返回。

该正规表达式搜索其后紧跟着空格的一个逗号;然后按[^,]* 的指示搜索零个或更多个不是逗号的字符,最后查找另一个逗号。

这种模式看起来有点像一个用逗号分隔的值字符串。

SELECT REGEXP_SUBSTR('first field, second field , third field',', [^,]*,')FROM dualREGEXP_SUBSTR('FIR------------------, second field ,REGEXP_REPLACE 函数让我们首先看一下传统的REPLACE SQL 函数,它把一个字符串用另一个字符串来替换。

假设您的数据在正文中有不必要的空格,您希望用单个空格来替换它们。

利用REPLACE 函数,您需要准确地列出您要替换多少个空格。

然而,多余空格的数目在正文的各处可能不是相同的。

下面的示例在Joe 和Smith 之间有三个空格。

REPLACE 函数的参数指定要用一个空格来替换两个空格。

相关文档
最新文档