zoukankan      html  css  js  c++  java
  • oracle正则表达式

    从oracle database 10gsql 开发指南中copy的。

    正则表达式:

    本节介绍正则表达式及相关的Oracle数据库函数。使用这些函数可以在字符串中搜索字符模式。例如,假设有下列年份:

    1965

    1968

    1971

    1970

    如果希望获得1965年和1968年之间的年份(包括1965年和1968年),就可以使用下面的正则表达式实现这种功能:

    ^196[5-8]$

    正则表达式中包含许多元字符(metacharacter)。在上面这个例子中,^、[5-8]以及$都是元字符。^可以匹配一个字符串的开头;[5-8]可以匹配介于5~8之间的数字;$可以匹配一个字符串的结尾。因此,^196可以匹配以196开头的字符串;[5-8]$可以匹配以5、6、7或8结尾的字符串。而^196[5-8]$就可以匹配1965、1966、1967和1968,这就是想要的结果。

    在下面这个例子中,假设有如下字符串,其中引用了莎士比亚的《罗密欧与朱丽叶》中的一句台词:

    But, soft! What light through yonder window breaks?

    如果想查找子字符串light,可以对引用的字符串应用下面的正则表达式:

    l[[:alpha:]]{4}

    在这个例子中,[[:alpha:]]和{4}都是元字符。[[:alpha:]]可以匹配A-Z或a-z之间的字符;{4}表示前面的匹配模式可以重复4次。当l、[[:alpha:]]和{4}一起使用时,可以匹配以 l 开头的5个字母组成的序列。因此,当对这个字符串应用正则表达式 l[[:alpha:]]{4}时,就可以匹配子字符串light。

    表4-7列出了在正则表达式中可以使用的部分元字符,同时还给出了这些元字符的意思以及使用这些元字符的简单例子。

    表4-7  正则表达式中的元字符

    元  字  符

    意    思

    例    子

    说明要匹配的字符是一个特殊字符、常量或者反向引用。(反向引用重复上一次匹配。)

    匹配换行符

    \ 匹配

    ( 匹配(

    ) 匹配)

    ^

    匹配字符串的开头位置

    如果A是字符串中的第一个字符,^A 匹配A

    $

    匹配字符串的末尾位置

    如果B是字符串中的最后一个字符,$B匹配B

    *

    匹配前面的字符0次或多次。

    ba*rk 可以匹配 brk、bark、baark等等

    +

    匹配前面的字符1次或多次。

    ba+rk 可以匹配bark、baark等等,但是不能匹配brk

    ?

    匹配前面的字符0次或1次

    ba?rk 只能匹配brk和bark

    {n}

    匹配一个字符恰好n次,其中n是一个整数

    hob{2}it 可以匹配hobbit

    (续表)  

    元  字  符

    意    思

    例    子

    {n,m}

    匹配一个字符至少n次,最多m次,其中n和m都是整数

    hob{2,3}it 只能匹配hobbit和hobbbit

    .

    匹配除null之外的任意单个字符

    hob.it 可以匹配hobait、hobbit等等

    (pattern)

    匹配指定模式的一个子表达式。可以使用子表达式构成复杂的正则表达式。在这种子表达式中,可以访问单次的匹配,称为捕获(capture)

    anatom(y|ies) 可以匹配anatomy和 anatomies

    x|y

    匹配x或y,其中x和y是一个或多个字符

    war|peace 可以匹配 war 或 peace

    [abc]

    匹配中括号内的任意一个字符

    [ab]bc 可以匹配 abc 和 bbc

    [a-z]

    匹配指定范围内的任意一个字符

    [a-c]bc 可以匹配 abc、bbc和cbc

    [: :]

    指定一个字符类,可以匹配该类中的任何字符

    [:alphanum:] 可以匹配字符0-9、A-Z和a-z

    [:alpha:] 可以匹配字符A-Z和a-z

    [:blank:] 可以匹配空格或tab键

    [:digit:] 可以匹配数字 0-9

    [:graph:] 可以匹配非空字符

    [:lower:] 可以匹配小写字母a-z

    [:print:] 与 [:graph:] 类似,不同之处在于[:print:] 包括空格字符

    [:punct:] 可以匹配标点符号.,'''等等

    [:space:] 可以匹配所有的空白字符

    [:upper:] 可以匹配所有的大写字母A~Z

    [:xdigit:] 可以匹配十六进制数字 0~9、A~F和a~f

    [..]

    匹配一个组合元素,例如多字符元素

    [==]

    指定等价类

    这是对前一次捕获的一个反向引用,其中n是一个正整数

    (.)1 可以匹配两个连续相同的字符。(.)可以匹配除null之外的任何单个字符,而 1 则重复上次匹配的内容,即再次匹配相同的字符,因此可以匹配两个连续相同的字符

           

    Oracle Database10gRelease 2新增加了很多类似于Perl的元字符,如表4-8所示。

    表4-8  类似于Perl的元字符

    元  字  符

    含    义

    d

    数字字符

    D

    非数字字符

    w

    字母字符

    W

    非字母字符

    s

    空白字符

    S

    非空白字符

    (续表)  

    元  字  符

    含    义

    A

    只匹配字符串的开头位置

    

    只匹配字符串的末尾位置或者字符串末尾的换行符之前的位置

    *?

    匹配前面的模式元素0次或多次

    +?

    匹配前面的模式元素1次或多次

    ??

    匹配前面的模式元素0次或1次

    {n}

    匹配前面的模式元素恰好n次

    {n,}

    匹配前面的模式元素至少n次

    {n,m}

    匹配前面的模式元素至少n次,但不超过m次

    表4-9列出了正则表达式函数。正则表达式函数是在Oracle Database10g中新增加的, Oracle Database11g中又增加了一些条目,如下表所示。

    表4-9  正则表达式函数

    函    数

    说    明

    REGEXP_LIKE( x, pattern

     [, match_option])

    从x中搜索pattern参数中定义的正则表达式。可以使用match_option修改默认匹配选项,该参数可以被设置为:

    •  'c',说明在匹配时区分大小写(默认选项)

    •  'I',说明在匹配时不区分大小写

    •  'n',允许使用可以匹配任意字符的操作符

    •  'm',将x作为一个包含多行的字符串

    REGEXP_INSTR( x, pattern

     [, start

     [, occurrence

     [, return_option

     [, match_option

    [, subexp_option]]]])

    在x中查找pattern,并返回pattern所在的位置。可以指定以下的可选参数:

    •  start 开始查找的位置。默认值是1,指x的第一个字符。

    •  occurrence 说明应该返回第几次出现pattern的位置。默认值是1,这意味着函数返回pattern第一次在x中出现的位置。

    •  return_option 说明应该返回什么整数。若该参数为0,则说明要返回的整数是x中的第一个字符的位置;若该参数为非0的整数,则说明要返回的整数为x中出现在pattern之后的字符的位置

    • match_option 修改默认的匹配设置,其工作方式与REGEXP_LIKEK()中指定的方式相同。

    •  subexp_option是Oracle Database 11g新增加的,其工作方式如下:对于具有子表达式的模式,subexp_option是0~9之间的一个非负数,指出pattern中的哪个子表达式是函数的目标。例如,考虑表达式0123(((abc)(de)f)ghi)45(678),此表达式有5个子表达式,分别是:"abcdefghi"、"abcdef"、"abc"、"de"和"678"。
    如果subexp_option是0,则返回pattern的位置。如果pattern没有正确的子表达式数字,则函数返回0。subexp_option为空值则返回空。subexp_option的默认值是0

    (续表)  

    函    数

    说    明

    REGEXP_REPLACE(x, pattern

     [, replace_string

     [, start

     [, occurrence

     [, match_option]]]])

    在x中查找pattern,并将其替换为replace_string。其他选项的意思与 REGEXP_INSTR()函数的参数完全相同

    REGEXP_SUBSTR( x, pattern

     [, start

     [, occurrence

     [, match_option

    [, subexp_option]]]])

    返回x中可以匹配pattern的一个子字符串,其开始位置由start指定。其他选项的意思与 REGEXP_INSTR()函数的参数完全相同。Oracle Database11g新增加的subexp_option其工作方式与REGEXP_INSTR()函数中相同

    REGEXP_COUNT( x, pattern

     [, start

     [, match_option]])

     

    这是Oracle Database11g新增加的一个函数。在x中查找pattern,并返回pattern在x中出现的次数。可以提供以下两个可选参数:

    •  start 开始查找的位置。默认值是1,指x的第一个字符。

    •  match_option 修改默认的匹配设置,其工作方式与REGEXP_LIKEK()中相同

    接下来的几节将会介绍更多有关正则表达式函数的知识。

    1. REGEXP_LIKE()

    REGEXP_LIKE(x, pattern [, match_option])用于在x中查找pattern参数中定义的正则表达式,该函数还可以提供一个可选参数match_option,它可以设置为下面几个字符之一:

    • 'c',说明在匹配时区分大小写(默认选项)
    • 'I',说明在匹配时不区分大小写
    • 'n',允许使用可以匹配任意字符的操作符
    • 'm',将x 作为一个包含多行的字符串

    下面这个查询使用REGEXP_LIKE函数检索生日在1965年到1968年之间的顾客:

    SELECT customer_id, first_name, last_name, dob

    FROM customers

    WHERE REGEXP_LIKE(TO_CHAR(dob, 'YYYY'), '^196[5-8]$');

     

    CUSTOMER_ID FIRST_NAME LAST_NAME    DOB

    ----------- ---------- ---------- ---------

                     1 John               Brown        01-JAN-65

                     2 Cynthia            Green        05-FEB-68

    下面这个查询检索名字以J或j开头的顾客。注意传递给REGEXP_LIKE()的正则表达式是 ^j,匹配选项是i,这说明不区分大小写,因此在本例中,^j 可以匹配J或j:

    SELECT customer_id, first_name, last_name, dob

    FROM customers

    WHERE REGEXP_LIKE(first_name, '^j', 'i');

     

    CUSTOMER_ID FIRST_NAME LAST_NAME    DOB

    ----------- ---------- ---------- ---------

                     1 John               Brown        01-JAN-65

    2. REGEXP_INSTR()

    REGEXP_INSTR(x, pattern [, start [, occurrence [, return_option [, match_option]]]])用于在x中查找pattern;REGEXP_INSTR()返回pattern出现的位置。匹配位置从1开始。

    下面这个查询使用REGEXP_INSTR函数返回匹配正则表达式 l[[:alpha:]]{4}的位置:

    SELECT

    REGEXP_INSTR('But, soft! What light through yonder window breaks?',

    'l[[:alpha:]]{4}') AS result

    FROM dual;

     

    RESULT

    ----------

    17

    注意返回值为17,这是light中l的位置。

    下面这个查询返回第二次匹配正则表达式 s[[:alpha:]]{3}的位置,匹配位置从1开始:

    SELECT

    REGEXP_INSTR('But, soft! What light through yonder window softly breaks?',

    's[[:alpha:]]{3}', 1, 2) AS result

    FROM dual;

     

    RESULT

    ----------

    45

    下面这个查询使用REGEXP_INSTR函数返回第二次匹配字母 o 的位置,匹配位置从10开始:

    SELECT

    REGEXP_INSTR('But, soft! What light through yonder window breaks?',

    'o', 10, 2) AS result

    FROM dual;

     

    RESULT

    ----------

    32

    3. REGEXP_REPLACE()

    REGEXP_REPLACE(x, pattern [, replace_string [, start [, occurrence[, match_option]]]])用于在x中查找pattern,并将其替换为 replace_string。

    下面这个查询使用REGEXP_REPLACE函数将匹配正则表达式 l[[:alpha:]]{4}的子字符串替换为字符串 sound:

    SELECT

    REGEXP_REPLACE('But, soft! What light through yonder window breaks?',

    'l[[:alpha:]]{4}', 'sound') AS result

    FROM dual;

     

    RESULT

    ---------------------------------------------------

    But, soft! What sound through yonder window breaks?

    注意light已经被替换为sound。

    4. REGEXP_SUBSTR()

    REGEXP_SUBSTR(x, pattern[, start [, occurrence[, match_option]]])用于在x中查找匹配pattern的子字符串,开始位置由 start指定。

    下面这个查询使用REGEXP_SUBSTR函数返回匹配正则表达式 l[[:alpha:]]{4}的子字符串:

    SELECT

    REGEXP_SUBSTR('But, soft! What light through yonder window breaks?',

    'l[[:alpha:]]{4}') AS result

    FROM dual;

     

    RESUL

    -----

    light

    5. REGEXP_COUNT()

    REGEXP_COUNT()是Oracle Database11g新增加的一个函数。REGEXP_COUNT(x, pattern[, start [,match_option]])用于在x中查找pattern,并返回pattern在x中出现的次数。可以提供可选参数start,指出要从x中开始查找pattern的那个字符;也可以提供可选的match_option字符串,指出匹配选项。

    下面这个查询使用REGEXP_COUNT函数返回正则表达式s[[:alpha:]]{3}出现的次数:

    SELECT

     REGEXP_COUNT('But, soft! What light through yonder window softly breaks?',

      's[[:alpha:]]{3}') AS result

    FROM dual;

     

        RESULT

    ----------

             2

    注意返回结果是2,这表明正则表达式在提供的字符串中有两次匹配。

  • 相关阅读:
    hdu 5119 Happy Matt Friends
    hdu 5128 The E-pang Palace
    hdu 5131 Song Jiang's rank list
    hdu 5135 Little Zu Chongzhi's Triangles
    hdu 5137 How Many Maos Does the Guanxi Worth
    hdu 5122 K.Bro Sorting
    Human Gene Functions
    Palindrome(最长公共子序列)
    A Simple problem
    Alignment ( 最长上升(下降)子序列 )
  • 原文地址:https://www.cnblogs.com/lgxstudy/p/4234982.html
Copyright © 2011-2022 走看看