[Oracle笔记]正值表达式搜索

(written in 2011-10-10 12:11:09 )


运算符

说明

\

反斜线字符根据上线文有4种含义。表示自己本身,引用下一个字符,引入一个运算符或什么都不做

*

匹配零次或多次出现

+

匹配一次或多次出现

?

匹配零次或多次出现

|

指定其他匹配项的运算符

^

匹配行的开始字符

$

匹配行的结束字符

.

匹配除NULL意外的受支持的字符集中的任何字符

[]

方括号表达式指定一匹配列表,该列表匹配列表中显示的任何表达式。非匹配列表达式以^开始,指定一个列表,除了列表中的显示的表达式,该列表可以匹配任何字符

()

分组表达式,看作单个子

{m}

匹配m

{m,}

至少匹配m

{m,n}

至少匹配m次,但不超过n

\n

反向引用backreference表达式(n1-9之间的数字)匹配圆括号和前面的\n之间的第n个子表达式

[..]

指定一个对照(collation)元素,可以是多字符元素(如,西班牙语中的[.ch.]

[::]

指定字符类型(如:[:alpha:])。可以匹配字符类中任何字符

[==]

指定等价类。例如:[=a=]匹配所有包含基本字母“a”的字符

 

字符类语法

含义

[:alnum:]

所有字母和数字字符

[:alpha:]

所有的字母字符

[:blank:]

所有的空格字符

[:cntrl:]

所有的控制字符(不会打印出来)

[:digit:]

所有的数字

[:graph:]

所有的[:punct:],[:upper:],[:lower:]和[:digit:]字符

[:lower:]

所有的小写字母

[:print:]

所有可打印的字符

[:punct:]

所有的标点符号

[:space:]

所有的空格字符(不会打印出来)

[:upper:]

所有的大写字母

[:xdigit:]

所有有效的十六进制字符

 

 

:从串中指定的地方开始搜索,一直到遇到下一个逗号

 

SELECTREGEXP_SUBSTR('MY LEDGER:Debits,Credits,and Invoices 1940',

'[:punct:][^,]+,'}  "REGEXP_SUBBSTR"

FROM DUAL;

 

结果如下

REGEXP_SU

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

: Debits,

 

 

REGEXP_SUBSTR函数

使用正则表达式来指定返回事的起点和终点。

 

REGEXP_SUBSTR(source_string,patten

[, position

[,occurrence

[,match_parameter]

]

]

)

REGEXP_SUBSTR返回与source_string字符集中的VARCHAR2CLOB数据相同的字符串。position默认值值为1,从第一个字符开始搜索;occurrence默认值为1的整型,指出Oracle应该在source_string中搜索patten指定的那一次出现。match_parameter是一个文本量,允许对函数的默认匹配行为进行更改,它可能的取值有:

  • 'i' 用于不区分大小的匹配
  • 'c' 用于区分大小写的匹配
  • 'n'允许句点(.)作为通配符去匹配换行符。如果省略该参数,则句点将不匹配换成行符
  • 'm'将源串视为多行,即Oracle将“^”和“$”分别看作源串中任意位置任何行的开始和结束,而不是仅仅看作整个源串的开始成结束。若缺省该参数则oracle将源串当作一行。

 

如果match_parameter指定了多个先后矛盾的值,那么Oracle使用最后一个值。

例:如果指定了“ic”,oracle将使用区分大小写的匹配。

 

例子:搜索不区分大小写匹配

SELECTREGEXP_SUBSTR

('MY LEDGER: DebitsCreditsand Invoices 1940'

'my',1,1,'i') "REGEXP_SUBSTR"

FROM DUAL;

 

RE

--

MY

 

REGEXP_INSTR函数

REGEXP_INSTR(source_string,pattern

[,position

[,occurrence

[,return_option

[,match_parameter]

]

]

   ]

)

如果return_option0oracle返回第一个字符出现的位置。这是默认值,与INSTR的作用相同。

如果return_option1,则oracle返回跟在所搜索字符出现以后下一个字符的位置,例如:查询返回了在串中发现的第一个数字的位置:

SELECT REGEXP_INSTR

('MY LEDGER:Debits,Creadits,and Invoices 1940',

'[[:digit:]]' "REGEXP_INSTR"

FROM DUAL;

 

运行结果:

REGEXP_INSTR

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

                       42

 

REGEXP_LIKE函数

 

REGEXP_LIKE(source_string,pattern

[ match_parameter]

    }

 

例:查询电话号码以415开头的人

SELECT lastname

FORM address

WHERE REGEXP_LIKE(Phone,'415+');

 

运行结果:

LASTNAME

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

ADAMS

ZACK

YARROW

WERSCHKY

BRANT

EDGAR

 

REPLACEREGEXP_REPLACE函数

 

REPLACE(char,search_string[,replace_string])

如果没有指定replace_string变量的值,当发现search_string时就会删除。可以输入任何数据类型:char,varchar2,nchar,nvarchar2,clob,nclob.

 

REGEXP_REPLACE(source_string,pattern

[,replace_string

[,position

[,occurrence

[,match_parameter]

]

]

]

)

occurrence是一个非负整数,它指定操作的次数:如果是0,则所有的匹配项目都被替代;如果指定一个正数,则Oracle替代第N次匹配

 

例:address表中的phone列,首先寻找格式为###-###-####的号码。该格式分为3个部分,#为数字部分,用-隔开。

SELECT REGEXP_SUBSTR(Phone,

'([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})

) "REGEXP_SUBBSTR"

FROM address

 

运行结果:

REGEXP_SUBST

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

213-456-1567

546-458-1564

 

:把上面的例子改成,把前面3个数字放在括号内,同时省略第一个“-”。为此,第1个数据的字符集为\1,第2个数据集为\2,第3个数据集为\3

SELECT REGEXP_REPLACE(Phone,

'([[:digit:]]{3})-([[:digit:]]{3})-([[:digit:]]{4})'

,'(\1) \2-\3'

) "REGEXP_REPLACE"

FROM address

 

运行结果:

REGEXP_SUBST

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

(213) 456-1567

(546) 458-1564

 

例:将电话中的第二个5替换成"."

SELECT REGEXP_REPLACE(Phone,

'5','.',

1,2

) "REGEXP_REPLACE"

FROM address;

 

运行结果:

REGEXP_SUBST

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

213-456-1.67

546-4.8-1564

 

REGEXP_COUNT函数

REGEXP_COUNT(source_char,pattern[,position[,match_param]])

REGEXP_COUNT返回pattern source_char 串中出现的次数。如果未找到匹配,则函数返回0。position 变量告诉Oracle 在源串的什么位置开始搜索。在开始位置之后每出现一次模式,都会使计数结果增加1。

 

match_param 变量支持下面几个值:

  • i 用于不区分大小写的匹配
  • c 用于区分大小写的匹配
  • n 允许句点(.)作为通配符去匹配换行符。如果省略该参数,则句点将不匹配换行符
  • m 将源串视为多行。即Oracle将^和$分别看作源串中任意位置任何行的开始和结束,而不是仅仅看作整个源串的开始或结束。如果省略该参数,则Oracle将源串看作一行。
  • x 忽略空格字符。默认情况下,空格字符与自身相匹配

 

用REGEXP_COUNT 取代LENGTH 还有一个好处,即可以进行不区分大小写的搜索,因此,前面的查询也可以写成下面这样:

   select REGEXP_COUNT('GEORGE','ge',1,'i') 

   from DUAL;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值