ORACLE 正则表达式摘录笔记
- 格式:doc
- 大小:60.00 KB
- 文档页数:5
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的正则表达式语法。
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 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 Database 10g中的正规表达式特性是一个用于处理文本数据的强大工具Oracle Database 10g的一个新特性大大提高了您搜索和处理字符数据的能力。
这个特性就是正规表达式,是一种用来描述文本模式的表示方法。
很久以来它已在许多编程语言和大量UNIX 实用工具中出现过了。
Oracle 的正规表达式的实施是以各种SQL 函数和一个WHERE子句操作符的形式出现的。
如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能。
已经对正规表达式很熟悉的读者可以了解如何在Oracle SQL 语言的环境中应用这种功能。
什么是正规表达式?正规表达式由一个或多个字符型文字和/或元字符组成。
在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式cat。
它被读作字母c,接着是字母a和t,这种模式匹配cat、location和catal og之类的字符串。
元字符提供算法来确定Oracle 如何处理组成一个正规表达式的字符。
当您了解了各种元字符的含义时,您将体会到正规表达式用于查找和替换特定的文本数据是非常强大的。
验证数据、识别重复关键字的出现、检测不必要的空格,或分析字符串只是正规表达式的许多应用中的一部分。
您可以用它们来验证电话号码、邮政编码、电子邮件地址、社会安全号码、IP 地址、文件名和路径名等的格式。
此外,您可以查找如HTML 标记、数字、日期之类的模式,或任意文本数据中符合任意模式的任何事物,并用其它的模式来替换它们。
用Oracle Database 10g使用正规表达式您可以使用最新引进的Oracle SQL REGEXP_LIKE操作符和REGEXP_INSTR、REGE XP_SUBSTR以及REGEXP_REPLACE函数来发挥正规表达式的作用。
您将体会到这个新的功能如何对LIKE操作符和INSTR、SUBSTR和REPLACE函数进行了补充。
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 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个数字。
查看当前用户所有表:Select * from tab;连接符:||空值:is null除去重复行:distinct查询结果排序:order by 排序字段asc(desc)比较运算符:> < (!= or <>) between andin 操作not in模糊查询Like使用:“ %”:代表匹配任意长度的任意字符。
“_”:代表匹配一个长度的任意字符。
特殊字符使用ESCAPE 标示:select * from posgoods where pgcname like '%*_%' escape '*';查询posgoods表中pgcname 字段中有‘_’字符的结果。
escape '*' 表示* 字符后面的是字符代表其实际意思,不做转义字符。
Oracle 10g支持正则表达式的四个新函数分别是:REGEXP_LIKE、REGEXP_INSTR、REGEXP_SUBSTR、和REGEXP_REPLACE。
它们使用POSIX 正则表达式代替了老的百分号(%)和通配符(_)字符。
特殊字符:'^' 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。
'$' 匹配输入字符串的结尾位置。
如果设置了RegExp 对象的Multiline 属性,则$ 也匹配'\n' 或'\r'。
'.' 匹配除换行符\n之外的任何单字符。
'?' 匹配前面的子表达式零次或一次。
'*' 匹配前面的子表达式零次或多次。
'+' 匹配前面的子表达式一次或多次。
'( )' 标记一个子表达式的开始和结束位置。
'[]' 标记一个中括号表达式。
'{m,n}' 一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。
Oracle Database 10g中的正规表达式特性是一个用于处理文本数据的强大工具Oracle Database 10g的一个新特性大大提高了您搜索和处理字符数据的能力。
这个特性就是正规表达式,是一种用来描述文本模式的表示方法。
很久以来它已在许多编程语言和大量UNIX 实用工具中出现过了。
Oracle 的正规表达式的实施是以各种SQL 函数和一个WHERE子句操作符的形式出现的。
如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能。
已经对正规表达式很熟悉的读者可以了解如何在Oracle SQL 语言的环境中应用这种功能。
什么是正规表达式?正规表达式由一个或多个字符型文字和/或元字符组成。
在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式cat。
它被读作字母c,接着是字母a和t,这种模式匹配cat、location和catal og之类的字符串。
元字符提供算法来确定Oracle 如何处理组成一个正规表达式的字符。
当您了解了各种元字符的含义时,您将体会到正规表达式用于查找和替换特定的文本数据是非常强大的。
验证数据、识别重复关键字的出现、检测不必要的空格,或分析字符串只是正规表达式的许多应用中的一部分。
您可以用它们来验证电话号码、邮政编码、电子邮件地址、社会安全号码、IP 地址、文件名和路径名等的格式。
此外,您可以查找如HTML 标记、数字、日期之类的模式,或任意文本数据中符合任意模式的任何事物,并用其它的模式来替换它们。
用Oracle Database 10g使用正规表达式您可以使用最新引进的Oracle SQL REGEXP_LIKE操作符和REGEXP_INSTR、REGE XP_SUBSTR以及REGEXP_REPLACE函数来发挥正规表达式的作用。
您将体会到这个新的功能如何对LIKE操作符和INSTR、SUBSTR和REPLACE函数进行了补充。
oracle正则表达式语法Oracle正则表达式语法正则表达式是一种常用的文本匹配方法,它可以在文本中搜索特定的字符串、取代或者操作一些文本操作,也有利于开发者更简洁的实现一些文本过滤的需求。
Oracle正则表达式语法是Oracle数据库提供的一种文本匹配方式,在处理大量数据时能够大大提高处理效率。
下面是Oracle正则表达式语法相关内容的详细介绍:1.匹配任意字符通配符可以替代任何字符,用”%”表示。
比如:”%moon%”可以匹配moon、bluemoon、bigmoon等。
2. 匹配单个字符“_”表示匹配单个字符。
比如:”d_g”可以匹配dog、dig、dug等。
3. 简单的字符匹配直接匹配字符即可,比如:'A'可以匹配A,'B'可以匹配B。
4. 区分大小写Oracle正则表达式中区分大小写。
比如:”A”只匹配A,“a”只匹配a。
5. 匹配多个字符可以使用方括号表示多个字符。
比如:[abc123]就可以匹配a、b、c、1、2、3。
6. 匹配任意一个字符用“.”匹配任意一个字符。
比如:”3.”可以匹配31、32、33等。
7. 匹配多个字符之间的内容在[]中使用“-”语法,表示匹配两个字符之间的内容。
比如:[3-8]可以匹配3、4、5、6、7、8。
8. 匹配条件选择使用竖线 | 来表示条件选择。
比如:”java|c++”可以匹配java和c++。
9. 匹配单个字符中的某个条件使用圆括号来设定多项匹配规则。
比如:(Java|Pearl|Python)可以匹配Java或Pearl或Python。
10. 匹配一个或多个使用 + 来表示出现一次或多次,比如:”bo+t”可以匹配bot、boot、bootoot等。
使用*来表示出现零次或多次,比如:”bo*t”可以匹配bt、bot、boot、bootoot等。
使用? 来表示出现零次或一次,比如:”bo?t”可以匹配bt、bot。
在数据库的查询和数据处理中,正则表达式(Regular Expression)是一个非常有用的工具。
在Oracle数据库中,正则表达式写法可以帮助我们更灵活、高效地进行数据的匹配和处理。
本文将从简到繁地探讨Oracle数据库正则表达式写法,以帮助读者更深入地理解并灵活应用这一特性。
1. 正则表达式概述正则表达式是一种用来描述字符串模式的工具,它可以帮助我们在文本中进行搜索、匹配和替换操作。
在Oracle数据库中,正则表达式的写法可以极大地扩展我们的数据处理能力,使得数据的查询和操作更加灵活和高效。
2. 基本正则表达式写法在Oracle数据库中,我们可以使用正则表达式进行模式匹配。
我们可以使用'^'来匹配以某个字符开头的字符串,使用'$'来匹配以某个字符结尾的字符串。
还可以使用'.'来匹配任意单个字符,使用'*'来匹配前面的字符零次或多次,使用'+'来匹配前面的字符一次或多次。
3. 高级正则表达式写法除了基本的正则表达式写法外,Oracle数据库还支持一些高级的正则表达式写法。
我们可以使用'\d'来匹配数字字符,使用'\w'来匹配单词字符,使用'\s'来匹配空白字符。
还可以使用'[]'来指定字符集,使用'|'来表示或的关系,使用'()'来分组表达式等。
4. 实际应用示例为了更好地理解Oracle数据库正则表达式的写法,我们可以通过一些实际的应用示例来加深印象。
我们可以使用正则表达式来提取文本中的通信方式号码、电流信箱位置区域等信息;也可以使用正则表达式来对文本中的特定模式进行替换或过滤等操作。
通过这些实际应用示例,我们可以更直观地感受到正则表达式在数据处理中的强大功能。
5. 个人观点和总结对于我个人来说,正则表达式是数据库查询和数据处理中非常重要的一部分。
分类:Linux----------------------feedback@b)REGEXP_INSTRREGEXP_INSTR返回与正则表达式匹配的字符和字符串的位置。
如SQL> select regexp_instr('The zip code 80831 is for falcon, co','[[:digit:]]{5}') REGEXP_INSTR from dual;REGEXP_INSTR------------14c)REGEXP_REPLACEREGEXP_REPLACE与REPLACE函数类似,提供一种修改与所给正则表达式匹配的字符串的方法。
作用包括纠正拼写错误、格式化输入输出的文本。
如电话号码的格式为:719-111-1111。
使用REGEX_REPLACER的返回值是:SQL> select regexp_replace('Reformat the phone number 719-111-1111 ...',2 '[1]?[-.]?(\(?[[:digit:]]{3}\)?)+[- .]?'3 || '([[:digit:]]{3})[- .]?([[:digit:]]{4})',4 ' (\1) \2-\3') regexp_replace5 from dual;REGEXP_REPLACE---------------------------------------------Reformat the phone number (719) 111-1111 ...Sd)REGEXP_LIKEREGEXP_LIKE运算符与LIKE运算符相似,但是功能更强大,因为它支持使用与此正则表达式与文本进行匹配。
语法如下:REGEXP_LIKE(source_string, pattern, match_parameter)Source_string可以是文字字符串,如果前面例中的字符串,也可以是包含某些字符串的变量或列。
1、正则表达式语法,正则表达式是在10g才添加进来的,其匹配字符、量词字符、匹配选项、相关函数如下:匹配字符内容:匹配字符位置和条件:匹配字符数量:匹配选项:函数:REGEXP_LIKE 是LIKE语句的正则表达式版本语法:REGEXP_LIKE(源字符串, 匹配表达式[,匹配选项])REGEXP_INSTR 返回源字符串中首次匹配正则表达式的起始位置语法:REGEXP_INSTR(srcstr, pattern [, position [, occurrence[,return_option [, match_option]]]])srcstr:源字符串pattern:正则表达式position:搜索开始位置occurrence:返回第几个匹配项return_option:返回选项,0表示开始位置,1表示返回匹配的结束位置match_option:匹配选项REGEXP_SUBSTR 返回源串中匹配正则表达式的子字符串语法:SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) srcstr:源字符串pattern:正则表达式position:搜索的开始位置occurrence:返回第几个匹配的字符串match_option:匹配选项REGEXP_REPLACE 用执行字符串替换源文本中与正则表达式匹配的字符串语法:REGEXP_REPLACE(srcstr, pattern [,replacestr [, position[, occurrence [, match_option]]]])srcstr:源字符串pattern:正则表达式replacestr:新的字符串position:搜索起始位置occurrence:第几个匹配项match_option:匹配选项例题说明:Evaluate the following expression using meta. character for regular expression:'[^Ale|ax.r$]'Which two matches would be returned by this expression? (Choose two.)A. AlexB. AlaxC. AlxerD. AlaxendarE. AlexenderAnswer: DE'[^Ale|ax.r$]'中^表示只匹配不在集合{'A','l','e','|','a','x','.','r','$'}中的字符, 此处的'|'、'.'、'$'只是表示普通的字符,而非匹配符本文由淄博SEO(),淄博网站优化()整理发布,转载请注明出处。
Oracle中的正则表达式(Regular Expression)正则表达式是很多编程语言中都有的。
可惜oracle8i、oracle9i中一直迟迟不肯加入,好在oracle10g中终于增加了期盼已久的正则表达式功能。
你可以在oracle10g中使用正则表达式肆意地匹配你想匹配的任何字符串了。
所谓正则表达式是对于字符串进行匹配的一种模式。
举个例子来说字符串’^198[0-9]$’可以匹配‘1980-1989’,也即80后出生的年份。
如果希望统计出公司那些员工是80后的,就可以使用如下的SQL语句:select * from emp where regexp_like(to_char(birthdate,’yyyy’),’^198[0-9]$’);这里用到了regexp_like和to_char函数。
这里在正则表达式中用到的^、$、[0-9]都被称为元数据(metacharacter),正则表达式都是由多元表达式组成的。
在这里,^表示一个字符串的开头,$表示一个字符串的结尾,因此^198表示以198开头的字符串,而[0-9]$则表示以0-9的数字结尾的字符串。
因此整体上’^198[0-9]$’就能匹配所有1980-1989的字符串。
正则表达式中常用到的元数据(metacharacter)如下:1.^ 匹配字符串的开头位置。
2.$ 匹配字符串的结尾位置。
3.* 匹配该字符前面的一个字符0次,1次或者多次出现。
例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。
4.+ 匹配该字符前面的一个字符1次或者多次出现。
例如52+oracle 可以匹配52oracle,522oracle,5222oracle等等5.? 匹配该字符前面的一个字符0次或1次。
例如52?oracle 只能匹配5oracle,52oracle6.{n} 匹配一个字符串n次,n为正整数。
Oracle Database 10g中的正规表达式特性是一个用于处理文本数据的强大工具Oracle Database 10g的一个新特性大大提高了您搜索和处理字符数据的能力。
这个特性就是正规表达式,是一种用来描述文本模式的表示方法。
很久以来它已在许多编程语言和大量UNIX 实用工具中出现过了。
Oracle 的正规表达式的实施是以各种SQL 函数和一个WHERE子句操作符的形式出现的。
如果您不熟悉正规表达式,那么这篇文章可以让您了解一下这种新的极其强大然而表面上有点神秘的功能。
已经对正规表达式很熟悉的读者可以了解如何在Oracle SQL 语言的环境中应用这种功能。
什么是正规表达式?正规表达式由一个或多个字符型文字和/或元字符组成。
在最简单的格式下,正规表达式仅由字符文字组成,如正规表达式cat。
它被读作字母c,接着是字母a和t,这种模式匹配cat、location和catal og之类的字符串。
元字符提供算法来确定Oracle 如何处理组成一个正规表达式的字符。
当您了解了各种元字符的含义时,您将体会到正规表达式用于查找和替换特定的文本数据是非常强大的。
验证数据、识别重复关键字的出现、检测不必要的空格,或分析字符串只是正规表达式的许多应用中的一部分。
您可以用它们来验证电话号码、邮政编码、电子邮件地址、社会安全号码、IP 地址、文件名和路径名等的格式。
此外,您可以查找如HTML 标记、数字、日期之类的模式,或任意文本数据中符合任意模式的任何事物,并用其它的模式来替换它们。
用Oracle Database 10g使用正规表达式您可以使用最新引进的Oracle SQL REGEXP_LIKE操作符和REGEXP_INSTR、REGE XP_SUBSTR以及REGEXP_REPLACE函数来发挥正规表达式的作用。
您将体会到这个新的功能如何对LIKE操作符和INSTR、SUBSTR和REPLACE函数进行了补充。
Oracle正则表达式语法基于Perl语言的正则表达式语法,区分大小写(case sensitive)。
以下是一些基本语法:
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次。
`|` 指两项之间的一个选择。
例如,`^([a-z]+|[0-9]+)$` 表示所有小写字母或数字组合成的字符串。
3. 边界匹配:`^` 匹配开始位置;`$` 匹配结束位置;`\b` 匹配单词边界,即单词的开头或结尾位置;`\B` 匹配非单词边界,即不是单词的开头或结尾位置。
4. 分组和引用:括号`()` 分组,标记一个子表达式的开始和结束位置;`\num` 引用第num个子表达式,num从1开始。
5. 字符集合:`[]` 表示一组字符中的任意一个。
6. 转义符:`\\` 表示转义一个字符。
Oracle正则表达式还支持贪婪匹配、非贪婪匹配、零宽断言(zero-width assertion)、后向引用(backreference)、捕获组等高级语法。
ORACLE 正则表达式一.正则表达式简介:正则表达式,就是以某种模式来匹配一类字符串。
一旦概括了某类字符串,那么正则表达式即可用于针对字符串的各种相关操作。
例如,判断匹配性,进行字符串的重新组合等。
正则表达式提供了字符串处理的快捷方式。
Oracle 10g及以后的版本中也支持正则表达式.二. 正则表达式相对通配符的优势:1.正则表达式中不仅存在着代表模糊字符的特殊字符,而且存在着量词等修饰字符,使得模式的控制更加灵活和强大。
2.通配符的使用一般是在特定的环境下,不同的环境下,通配符有可能不同。
而正则表达式,不但广泛应用于各种编程语言,而且在各种编程语言中,保持了语法的高度一致性。
三. 元字符:元字符是指在正则表达式中表示特殊含义的字符。
量词用来指定量词的前一个字符出现的次数。
量词的形式主要有“?”、“*”、“+”、“{}”。
量词在用于匹配字符串时,默认遵循贪婪原则。
贪婪原则是指,尽可能多地匹配字符。
例如:字符串“Function(p),(OK)”,如果使用正则表达式“\(.*\)”进行匹配,则得到字符串“(p),(OK)” ,而非“(p)”;若欲得到“(p)”,则必须取消量词的贪婪原则,此时只需要为量词后追加另外一个数量词“?”即可。
如上面的正则表达式应该改为“\(.*?\)”。
五. 字符转义:元字符在正则表达式中有特殊含义。
如果需要使用其原义,则需要用到字符转义。
字符转义使用字符“\”来实现。
其语法模式为:“\”+元字符。
例如,“\.”表示普通字符“.”;“\.doc”匹配字符串“.doc”;而普通字符“\”需要使用“\\”来表示。
六. 字符组.字符组是指将模式中的某些部分作为一个整体。
这样,量词可以来修饰字符组,从而提高正则表达式的灵活性。
字符组通过()来实现.许多编程语言中,可以利用“$1”、“$2”等来获取第一个、第二个字符组,即所谓的后向引用。
在Oracle中,引用格式为“\1”、“\2”。
七. 正则表达式分支可以利用“|”来创建多个正则表达式分支。
例如,“\d{4}|\w{4}”可以看做两个正则表达式——“\d{4}”和“\w{4}”,匹配其中任何一个正则表达式的字符串都被认为匹配整个正则表达式。
如果该字符串两个正则表达式分支都匹配,那么将被处理为匹配第一个正则表达式分支。
八. 字符类.在Oracle中,正则表达式的用法与标准用法略有不同。
这种不同主要体现在对于字符类的定义上。
Orale中不使用字符“\”与普通字符组合的形式来实现字符九. ORACLE中的四个正则表达式相关函数.1.regexp_like(expression, regexp)返回值为一个布尔值。
如果第一个参数匹配第二个参数所代表的正则表达式,那么将返回真,否则将返回假。
举例:select * from people where regexp_like(name, '^J.*$');相当于: select * from people where name like 'J%';2.regexp_instr(expression, regexp, startindex, times)返回找到的匹配字符串的位置.参数startindex表示开始进行匹配比较的位置;参数times表示第几次匹配作为最终匹配结果。
举例:select regexp_instr('12.158', '\.') position from dual;regexp_instr('12.158', '\.')用于获取第一个小数点的位置。
3.regexp_substr(expression, regexp)返回第一个字符串参数中,与第二个正则表达式参数相匹配的子字符串。
举例: create table html(id integer, html varchar2(2000));insert into htmlvalues (1, '<a href="/2009/1009.html">maillink</a>');表html中存储了HTML标签及内容。
现欲从标签<a>中获得链接的url,那么可以利用regexp_substr()函数。
select id, regexp_substr(html, 'http[a-zA-Z0-9\.:/]*') url from html;4. regexp_replace(expression, regexp, replacement)将expression中的按regexp匹配到的部分用replacement代替.在参数replacement中,可以含有后向引用,以便将正则表达式中的字符组重新捕获。
例如,某些国家和地区的日期格式可能为“MM/DD/YYYY”,那么可以利用regexp_replace()函数来转换日期格式。
select regexp_replace('09/29/2008', '^([0-9]{2})/([0-9]{2})/([0-9]{4})$', '\3-\1-\2') replacefrom dual;注: 在进行正则表达式匹配时,还可以忽略字符大小写形式进行匹配.但是不能解除[[:upper:]]和[[:lower:]]的作用.select * from people where regexp_like(name, 'or');select * from people where regexp_like(name, 'or', 'i'); --…i‟表示忽略大小写十. 正则表达式练习第一:REGEXP_LIKE函数用法EMP表结构如下:SQL> desc emp;Name Null? Type----------------------------------------- -------- ----------------------------EMPNO NOT NULL NUMBER(4) ENAMEVARCHAR2(10)JOB VARCHAR2(9) MGR NUMBER(4) HIREDATE DATESAL NUMBER(7,2) COMM NUMBER(7,2) DEPTNO NUMBER(2)EMP表中部分数据如下:SQL> select empno,ename,sal,hiredate from emp;EMPNO ENAME SAL HIREDATE---------- ---------- ---------- --------------7369 SMITH 800 17-12月-807499 ALLEN 1600 20-2月-817521 WARD 1250 22-2月-817566 JONES 2975 02-4月-81下面给出几种REGEXP_LIKE函数的例子1、查找员工编号为4位数字的员工信息SQL> select empno,ename from emp where regexp_like(empno,'^[[:digit:]]{4}$');或者: select empno,ename from emp where regexp_like(empno,'^[0-9]$');EMPNO ENAME---------- ----------7369 SMITH7499 ALLEN7521 WARD7566 JONES2、查找员工姓名为全英文的员工信息SQL> select empno,ename from emp where regexp_like(ename,'^[[:alpha:]]+$');或者: select * from emp where regexp_like(ename,'^[a-zA-Z]+$');EMPNO ENAME---------- ----------7369 SMITH7499 ALLEN7521 WARD7566 JONES7654 MARTIN3、查找员工姓名以“a”字母开头,不区分大小写SQL> select empno,ename from emp where regexp_like(ename,'^a','i');EMPNO ENAME---------- ----------7499 ALLEN7876 ADAMS4、查找员工姓名为全英文,且以“N”结尾的员工信息SQL> select empno,ename from emp where regexp_like(ename,'^[[:alpha:]]+N$');EMPNO ENAME---------- ----------7499 ALLEN7654 MARTIN5、查找员工编号以非数字开头的员工信息SQL> select empno,ename from emp where regexp_like(empno,'[^[:digit:]]');no rows selected第二:REGEXP_INSTR函数用法1、查找员工编号中第一个非数字字符的位置SQL> select regexp_instr(empno,'[^[:digit:]]') position from emp;POSITION----------2、从第三个字符开始,查找员工编号中第二个非数字字符的位置SQL> select regexp_instr(empno,'[^[:digit:]]',3,2) position from emp; POSITION----------第三:REGEXP_SUBSTR函数用法1、返回从ename的第二个位置开始查找,并且是以“L”开头到结尾的字串SQL> select regexp_substr(ename,'L.*','2') substr from emp;SUBSTR------------------LLENLAKELARK第四:REGEXP_REPLACE函数用法1、把ename中所有非字母字符替换为“A”SQL> update emp set ename=regexp_replace(ename, '[^[:alpha:]]', 'A')2 where regexp_like(ename, '[^[:alpha:]]');1 row updated。