oracle 正则表达式 匹配

oracle 正则表达式

在实际应用中,想排除带有中文的字段值:

select h.froomnumber from t_broker_house h where REGEXP_LIKE(froomnumber,‘^([a-z0-9A-Z]|-)*$‘)

字符串’^198[0-9]$’可以匹配‘1980-1989’,如果希望统计出公司那些员工是80年~89年入职的,就可以使用如下的SQL语句:

select * from emp e where regexp_like(to_char( e.hiredate,‘yyyy‘),‘^198[0-9]$‘);

正则表达式中常用到的元数据(metacharacter)如下:

^ 匹配字符串的开头位置。

$ 匹配支付传的结尾位置。

* 匹配该字符前面的一个字符0次,1次或者多次出现。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。

+ 匹配该字符前面的一个字符1次或者多次出现。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等

? 匹配该字符前面的一个字符0次或1次或者多次出现。例如52?oracle 只能匹配5oracle,52oracle等等

{n} 匹配一个字符串n次,n为正整数。例如:hel{2}o 所匹配的是hello

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

. 匹配除了null之外的任何单个字符串

(pattern) 这个是用来匹配指定模式的一个子表达式

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

[abc] 匹配括号中的任意一个字符。例如:[ab]bc可以匹配abc和bbc

[a-z] 匹配指定范围内的任意字符串。例如[A-G]hi可以匹配Ahi至Ghi

[::]指定一个字符类,可以匹配该类中的任意字符 这里的字符类包括:

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

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

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

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

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

[:punct:]可以匹配. , ” ‘等标点符号。

[:upper:]可以匹配字符A-Z

[:lower:]可以匹配字符a-z

关于orace中的正则表达式只能通过oracle特意为正则表达式设计的4个函数来使用。

这4个函数分别是:

regexp_like,regexp_instr,regexp_replace,regexp_substr。

ORACLE正则表达式函数详解
  

ORACLE正则表达式函数详解

Oracle10g提供了四个正则表达式函数regexp function: REGEXP_LIKE, REGEXP_REPLACE,REGEXP_INSTR,REGEXP_SUBSTR。

REGEXP_LIKE:(匹配) 比较一个字符串是否与正则表达式匹配

(srcstr, pattern [, match_option])

REGEXP_INSTR:(包含)在字符串中查找正则表达式,并且返回匹配的位置

(srcstr, pattern [, position [, occurrence [, return_option [, match_option]]]])

REGEXP_SUBSTR:(提取) 返回与正则表达式匹配的子字符串

(srcstr, pattern [, position [, occurrence [, match_option]]])

REGEXP_REPLACE:(替换)搜索并且替换匹配的正则表达式

(srcstr, pattern [, replacestr [, position [, occurrence [, match_option]]]])

srcstr:        被查找的字符数据。

pattern:       正则表达式。

occurrence:    出现的次数。默认为1。

position:      开始位置

return_option: 默认值为0,返回该模式的起始位置;值为1则返回符合匹配条件的下一个字符的起始位置。

replacestr:    用来替换匹配模式的字符串。

match_option:  匹配方式选项。缺省为c。

c:case sensitive

I:case insensitive

n:(.)匹配任何字符(包括newline)

m:字符串存在换行的时候被作为多行处理

##################################################################################

正则表达式由以下标准的元字符(metacharacters)所构成:

字符

[[:alpha:]]任何字母。[A-Za-z]

[[:digit:]]任何数字。[0-9]

[[:alnum:]]任何字母和数字。[A-Za-z0-9]

[:blank:]   [ ],标准是空格和TAB,但Oracle里只有空格!

[:cntrl:]   CONTROL键

[:graph:]  即所有可见字符,不包括空格

[:print:]  可打印字符 ,即空格+所有可见字符

[[:space:]] 空白字符。

[[:punct:]] 任何标点符号。

[[:upper:]] 任何大写字母。[A-Z]

[[:lower:]] 任何小写字母。[a-z]

[[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]。

#######

[:class:]   字符类。class如alnum、digit等。

[.element.] 整理类。受NLS_SORT影响。将多字节字符当作单字节字符看待。如在西班牙语中ch、ll都是用多字节表示的单字节。

[=char=]    等同类。在当前语言(Locale)下,匹配所有的属于相同的POSIX等同类字符指定的字符。如在西班牙语中,[[=n=]]指定了等同类字符n,它可以匹配El Ni?o中的N和 ?.

###########################################################################

边界符集合

^   每一行的开头,单行模式下等价于字符串的开头

$   每一行的结尾,单行模式下等价于字符串的结尾

在单行模式下,^和\A等价,$和\Z等价。

##########################################################################

重复次数集合

*   匹配零次或多次--尽可能多的次数

?   零次或一次

+   一次或多次

{m} {m}?正好m次,贪婪与非贪婪一样的

{m,}    {m,}?至少m次

{m, n}  {m, n}?最少m最多n次

在上述字符后加?,如:*?,即为非贪婪模式。

贪婪模式会获取尽可能多的字符,而非贪婪模式会获取尽可能少的字符

###############################################################

组合操作符

[…]     方括号内任意字符或字符集合中的一个。在其中所有的操作符号都被视为普通符号,但以下除外:

★范围操作符:- 但当"-"位于字符列表的第一个或最后一个字符时,或位于范围的结尾时,会被当作"-"本身来看待。

当右方括号"]"出现在列表的第一个位置时,它会被当作"]"本身来处理。

[^…]    方括号内^为第一个字符时,表示与其后所有字符都不匹配的字符

(…)     圆括号,将复杂表达式当作单一表达式来处理

..|..    或

abc      和。直接将字符连在一起写

优先级比较:圆括号>重复次数操作符>和>或。

例如,(f|ht)tps?: 表示

ftp:

ftps:

http:

https:

######################################################################

匹配操作符

\n      即后向引用。n为1~9,标识由圆括号里取得的匹配字符串。方向是从左到右。

转义操作符

\       将其后紧跟着的操作字符当作普通字符看待。

例如 abc*def 可以匹配 abdef或abcccdef等,但无法匹配abc*def,后者需要abc\*def才能匹配

##################################################

一条正则表达式匹配函数示例解析:

SELECT * FORM tKHXX where  REGEXP_LIKE(SJHM,  ‘^[1]{1}[35]{1}[[:digit:]]{9}$‘ )

这个语句是从表中查手机号。

^ 表示开始

$ 表示结束

[]内部为匹配范围

{}里的内容表时个数

手机号码的特点是以 1开头接着是3或5再加9位的数字 所以这么理解

1开头 表达式为 ^[1]{1} 意为 开始1位里包含1

3或5 表达式为 [35]{1},即第二位包含有3或5的

9位数字结束 为: [[:digit:]]{9}$ 这里[:digit:]为特殊写法,代表为数字,再加个结束符$。即最后9位是数字。

#######################################################################

后向引用(backreference):

后向引用是一个很有用的特性。它能够把子表达式的匹配部分保存在临时缓冲区中,供以后重用。缓冲区从左至右进行编号,并利用 \digit 符号进行访问。子表达式用一组圆括号来显示。利用后向引用可以实现较复杂的替换功能。

下面的regexp_replace(‘Steven Chen‘, ‘(.*) (.*)‘, ‘\2, \1‘)  此函数中,首先在正则表达式函数中,(‘Steven Chen‘, ‘(.*) (.*)‘, 其中两个圆括号中会匹配出Chen, Steven;再使用"\数字“的符号进行引用。

?


1

2

3

4

5

6

7

8

9

    SQL> select regexp_replace(‘Steven Chen‘, ‘(.*) (.*)‘, ‘\2, \1‘) as reversed_name from dual;       

    REVERSED_NAME 

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

    Chen, Steven 

在DDL中也可以正则表达式,比如Constraint, index, view

Sql代码 

    SQL> alter table person add constraint constraint_zip check (regexp_like(zip, ‘^[[:digit:]]+$‘)); 

      

    SQL> create index person_idx on person(regexp_substr(last_name, ‘^[[:upper:]]‘));

http://blog.sina.com.cn/s/blog_69e7b8d701012tuj.html

时间: 2024-08-08 09:27:03

oracle 正则表达式 匹配的相关文章

Oracle正则表达式之 Regexp_substr,Regexp_instr,Regexp_replace,Regexp_like

Oracle正则表达式使用介绍 正则表达式具有强大.便捷.高效的文本处理功能.能够添加.删除.分析.叠加.插入和修整各种类型的文本和数据.Oracle从10g开始支持正则表达式 下面通过一些例子来说明使用正则表达式来处理一些工作中常见的问题. 1. REGEXP_SUBSTR REGEXP_SUBSTR 函数使用正则表达式来指定返回串的起点和终点,返回与source_string 字符集中的VARCHAR2 或CLOB 数据相同的字符串. 语法: --1.REGEXP_SUBSTR与SUBSTR

Oracle正则表达式之匹配网址

利于正则表达式匹配出网址 --1 表准备create table test_regexp( object varchar2(50)); --2 数据准备 insert into test_regexp (OBJECT)values ('http://www.baidu.com'); insert into test_regexp (OBJECT)values ('http://360.cn'); insert into test_regexp (OBJECT)values ('https://h

oracle正则表达式

需求: 匹配手机号,第一位可以是+,可以没有+,后面的全部要是数字,如: +861359415665 8613659558555 1356856455 都是合法的. +aa156945555 aa1359556666 aaddssdfdfsd 都是不合法的. 正则: [sql] view plaincopyprint? SQL> SELECT * FROM DUAL WHERE regexp_like('+333333' ,'^[\+]*[[:digit:]]+');      --该+转义或者

backreference Oracle正则表达式中的反向引用

这是Oracle对正则表达式的backreference的描述 从定义中可以看到,当匹配表达式中已()的形式将一个子串包含起来,后面就可以以\?的形式来引用.\1对应第一个(),\2对应第二个... 反向引用的引入使得正则表达式的匹配功能变得更加强大,介绍两个在oracle正则函数中的应用 regexp_like regexp_like('1211233','^([0-9])(\d)\1\1\2(\d)\3$') 上面这个例子中,匹配表达式里,\1表示第一个([0-9]),这个表达式要判断字符串

Oracle正则表达式-初级使用

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

Oracle正则表达式-初级

==================Oracle 正则表达式使用===============================================oracle正则表达式 ORACLE中的支持正则表达式的函数主要有下面四个: 1,REGEXP_LIKE :与LIKE的功能相似 2,REGEXP_INSTR :与INSTR的功能相似 3,REGEXP_SUBSTR :与SUBSTR的功能相似 4,REGEXP_REPLACE :与REPLACE的功能相似 它们在用法上与Oracle SQ

Oracle正则表达式函数:regexp_like、regexp_substr、regexp_instr、regexp_replace

Oracle正则表达式函数:regexp_like.regexp_substr.regexp_instr.regexp_replace --去掉所有特殊字符,只剩字母 SELECT REGEXP_REPLACE('(Sam-Tomats123-=,.231+)','[^[:alpha:]]','') FROM dual; Sql代码 Oracle使用正则表达式离不开这4个函数: 1.regexp_like 2.regexp_substr 3.regexp_instr 4.regexp_repla

oracle正则表达式的用法

<SPAN style="FONT-SIZE: 18px">Oracle 正则表达式函数-REGEXP_SUBSTR 使用例子 .5个参数 第一个是输入的字符串 第二个是正则表达式 第三个是标识从第几个字符开始正则表达式匹配.(默认为1) 第四个是标识第几个匹配组.(默认为1) 第五个是是取值范围: i:大小写不敏感: c:大小写敏感: n:点号 . 不匹配换行符号: m:多行模式: x:扩展模式,忽略正则表达式中的空白字符. 全部测试数据SQL> select *

Oracle Study之--Oracle正则表达式

Oracle Study之--Oracle正则表达式 案例要求: 建立check constraint ,要求字段输入内容必须是"00[number][number][a-z]": 通过正则表达式建立如下约束(constraint): 17:20:13 [email protected] prod >desc card Name                                                              Null?    Type -