• 1. 第21章 Oracle中的正则表达式在各种编程语言中,正则表达式都有着广泛的应用。Oracle 10g及以后的版本中也支持正则表达式,并提供了非常实用的函数。本章首先讲述正则表达式的基本知识,最后讲述Oracle中的正则表达式函数。本章的主要内容包括: 正则表达式基础知识; Oracle中的正则表达式函数。
  • 2. 21.1 正则表达式简介正则表达式,就是以某种模式来匹配一类字符串。一旦概括了某类字符串,那么正则表达式即可用于针对字符串的各种相关操作。例如,判断匹配性,进行字符串的重新组合等。正则表达式提供了字符串处理的快捷方式。
  • 3. 22.1.1 正则表达式与通配符正则表达式是一个模式,正则表达式可以看做一个模糊的字符串匹配;而通配符也可以看做模糊的字符串匹配。 正则表达式与通配符虽有相似之处,但却有着本质的区别。正则表达式中不仅存在着代表模糊字符的特殊字符,而且存在着量词等修饰字符,使得模式的控制更加灵活和强大。另外,通配符的使用一般是在特定的环境下,例如Windows的查询功能等,在不同的环境下,通配符有可能不同。而正则表达式,不但广泛应用于各种编程语言,而且在各种编程语言中,保持了语法的高度一致性。
  • 4. 22.1.2 正则表达式与编程语言在各种编程语言中,可以说,正则表达式是无处不在的。正则表达式在各种编程语言中高度统一,都遵循一致的语法。因此,一旦熟悉了一种编程语言中的正则表达式,那么,可以直接应用于其他编程语言。编程语言同时也是正则表达式的载体,没有编程语言,正则表达式的作用将无从发印
  • 5. 21.2 正则表达式基础知识正则表达式简单易学。本节将从以下几方面讲述正则表达式的基础知识。 元字符和普通字符; 量词; 字符转义与字符类; 字符组; 正则表达式分支。
  • 6. 21.2.1 元字符和普通字符编程语言与普通文本文件的区别在于,编程语言中定义了保留字。这些保留字,都被编译器当做特殊命令来处理。其余才被当做普通字符串进行处理。 正则表达式的定义是以字符为基本单位的。这些字符也可以分为“保留字符”与普通字符两类,分别称为元字符和普通字符。元字符是指在正则表达式中表示特殊含义的字符。正则表达式中的元字符包括“.”、“\”、“?”、“*”、“+”、“|”、“{” 、“}”、“^”、“$”、“[”、“]”。 例如,元字符中的“.”用于匹配任何单字符(换行符除外);“\” 可以与普通字符组合来表示特殊字符,也可与元字符组合使用来获得元字符的原义字符。元字符“^”和“$”用于匹配输入字符串的开始和结束。默认情况下,这里的开始和结束是指整个字符串的开头和结尾。 普通字符是指除元字符外的所有Unicode字符。普通字符匹配其本身。例如,字符“a”代表原义字符“a”。
  • 7. 21.2.2 量词量词用来指定量词的前一个字符出现的次数。量词的形式主要有“?”、“*”、“+”、“{}”。 元字符“?”作为量词出现,用来匹配0个或1个字符。例如A?,表示0个或1个字符“A”。 元字符“*”作为量词出现,用来匹配0个或多个字符。例如A*,表示0个或多个字符“A”。 元字符“{”和“}”同时出现,用来匹配指定个数的字符,其形式有三种情况:A{3}表示匹配三个字符“A”;A{3,}表示匹配三个或更多个字符“A”;A{3,5}表示匹配3到5个字符“A”。 量词在用于匹配字符串时,默认遵循贪婪原则。贪婪原则是指,尽可能多地匹配字符。例如字符串“Function(p),(OK)”,如果使用正则表达式“\(.*\)”进行匹配,则得到字符串“(p),(OK)” ,而非“(p)”;若欲得到“(p)”,则必须取消量词的贪婪原则,此时只需要为量词后追加另外一个数量词“?”即可。如上面的正则表达式应该改为“\(.*?\)”。
  • 8. 21.2.3 字符转义与字符类字符转义是指通过元字符“\”与其他字符进行组合。这里的“其他字符”包括了元字符和普通字符。 元字符在正则表达式中有特殊含义。如果需要使用其原义,则需要用到字符转义。字符转义使用字符“\”来实现。其语法模式为:“\”+元字符。例如,“\.”表示普通字符“.”; “\.doc”匹配字符串“.doc”;而普通字符“\”需要使用“\\”来表示。
  • 9. 21.2.4 字符组的使用字符组是指将模式中的某些部分作为一个整体。这样,量词可以来修饰字符组,从而提高正则表达式的灵活性。例如,使用元字符和普通字符的组合,很难针对字符串“abc123abc123abc123”来归纳正则表达式。此时可以利用字符组来实现,相应的正则表达式可以表示为“(abc123)+”,表示连续的多个“abc123”组合。 字符组的另一个重要作用在于,许多编程语言中,可以利用“$1”、“$2”等来获取第一个、第二个字符组,即所谓的后向引用。在Oracle中,引用格式为“\1”、“\2”。
  • 10. 21.2.5 正则表达式分支可以利用“|”来创建多个正则表达式分支。例如,“\d{4}|\w{4}”可以看做两个正则表达式——“\d{4}”和“\w{4}”,匹配其中任何一个正则表达式的字符串都被认为匹配整个正则表达式。如果该字符串两个正则表达式分支都匹配,那么将被处理为匹配第一个正则表达式分支。
  • 11. 21.2.6 Oracle中正则表达式的特殊性在Oracle中,正则表达式的用法与标准用法略有不同。这种不同主要体现在对于字符类的定义上。Orale中不使用字符“\”与普通字符组合的形式来实现字符类,而是具有其特殊语法: [[:alpha:]]:表示任意字母,正则表达式的一般语法为\w。 [[:digit:]]:表示任意数字,正则表达式的一般语法为\d。 [[:lower:]]:表示任意小写字母。
  • 12. 21.2.6 Oracle中正则表达式的特殊性[[:alnum:]]:表示任意字母和数字。 [[:space:]]:表示任意空白字符,正则表达式的一般语法为\s。 [[:upper:]]:表示任意大写字母。 [[:punct:]]:表示任意标点符号。 [[:xdigit:]]:表示任意16进制的数字,相当于[0-9a-fA-F]。
  • 13. 21.3 正则表达式在Oracle中的应用Oracle 10g及以后的版本都提供了对正则表达式的支持。而这种支持,主要是通过提供函数来体现的。Oracle中共有四个正则表达式相关函数,它们分别是: regexp_like() regexp_instr() regexp_substr() regexp_replace()
  • 14. 21.3.1 regexp_like()的使用regexp_like()函数的常用形式为regexp_like(expression, regexp)。其中第一个参数为字符串,可以是数据表中的列或者表达式获得的字符串;第二个参数也是一个字符串,该参数用于表示进行匹配的正则表达式。函数的返回值为一个布尔值。如果第一个参数匹配第二个参数所代表的正则表达式,那么将返回真,否则将返回假。 select * from people where regexp_like(name, '^J.*$'); select * from people where name like 'J%';
  • 15. 21.3.2 regexp_ instr ()的使用regexp_instr()函数的常用形式为regexp_instr(expression, regexp, startindex, times)。其中,第一个参数expression为字符串,可以是表中的列或者字符串表达式;第二个参数regexp为字符串,表示要进行匹配的正则表达式;第三个参数startindex表示开始进行匹配比较的位置;第四个参数表示第几次匹配作为最终匹配结果。其中第三个和第四个参数为可选参数,默认值均为1。该函数用于获得正确匹配时,指针在字符串expression中的位置。 select regexp_instr('12.158', '\.') position from dual; regexp_instr('12.158', '\.')用于获取第一个小数点的位置。正则表达式“\.”表示普通字符“.”
  • 16. 21.3.3 regexp_substr ()的使用regexp_substr()函数的常用形式为regexp_substr(expression, regexp)。该函数的第一个参数为字符串,可以是表中的列或者字符串表达式;第二个参数为正则表达式。该函数用于返回第一个字符串参数中,与第二个正则表达式参数相匹配的子字符串。 create table html(id integer, html varchar2(2000)); insert into html values (1, 'mail link'); 表html中存储了HTML标签及内容。现欲从标签中获得链接的url,那么可以利用regexp_substr()函数。 select id, regexp_substr(html, 'http[a-zA-Z0-9\.:/]*') url from html;
  • 17. 21.3.4 regexp_ replace ()的使用regexp_replace()函数的常用形式为regexp_replace(expression, regexp, replacement)。其中,第一个参数expression为字符串类型,可以是表中的列或者字符串;第二个参数regexp为一个字符串,是用来进行匹配操作的正则表达式;第三个参数replacement是一个字符串,该字符串用于替换expression中的匹配部分。 值得注意的是,在参数replacement中,可以含有后向引用,以便将正则表达式中的字符组重新捕获。例如,某些国家和地区的日期格式可能为“MM/DD/YYYY”,那么可以利用regexp_replace()函数来转换日期格式。 select regexp_replace('09/29/2008', '^([0-9]{2})/([0-9]{2})/([0-9]{4})$', '\3-\1-\2') replace from dual;
  • 18. 21.4 本章实例在进行正则表达式匹配时,还可以忽略字符大小写形式进行匹配。这是比使用LIKE判式更加灵活和方便之处。 select * from people where regexp_like(name, 'or'); select * from people where regexp_like(name, 'or', 'i');
  • 19. 21.5 本章小结本章讲述了正则表达式的基本知识。正则表达式语法在各种编程语言中具有高度的一致性。只是在不同的编程环境中有少许差异。因此,学习时,应当注重把握其一般语法,再结合环境的特殊性。本章还讲述了正则表达式与通配符的区别,并展示了正则表达式的灵活性和不同用法。其中,特别值得关注的是后向引用的用法。
  • 20. 21.6 习题1.简述正则表达式与通配符的区别。 2.简述正则表达式匹配时的贪婪原则。 3.简述Oracle正则表达式的特殊性。 4.利用regexp_replace()函数将YYYY-MM-DD格式的字符串,转换为MM/DD/YYYY格式。