您的当前位置:首页正文

oracle正则表达式函数和正则表达式简介

2023-11-09 来源:好兔宠物网

Oracle使用正则表达式4个函数:   1。regexp_like(expr_col,‘正则表达式‘)

2。regexp_substr(expr_col,‘   3。regexp_instr     4。regexp_replace

POSIX 正则表达式由标准的元字符(metacharacters)所构成:   ‘^‘ 匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。   ‘$‘ 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性,则 $ 也匹配 ‘‘ 或 ‘‘。   ‘.‘ 匹配除换行符之外的任何单字符。   ‘?‘ 匹配前面的子表达式零次或一次。   ‘+‘ 匹配前面的子表达式一次或多次。   ‘*‘ 匹配前面的子表达式零次或多次。   ‘|‘ 指明两项之间的一个选择。例子‘^([a-z]+|[0-9]+)$‘表示所有小写字母或数字组合成的字符串。   ‘( )‘ 标记一个子表达式的开始和结束位置。   ‘[]‘ 标记一个中括号表达式。   ‘{m,n}‘ 一个精确地出现次数范围,m=<出现次数<=n,‘{m}‘表示出现m次,‘{m,}‘表示至少出现m次。   um 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。   字符簇:     [[:alpha:]] 任何字母。    [[:digit:]] 任何数字。    [[:alnum:]] 任何字母和数字。    [[:space:]] 任何白字符。    [[:upper:]] 任何大写字母。    [[:lower:]] 任何小写字母。    [[:punct:]] 任何标点符号。    [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]。    各种操作符的运算优先级   转义符   (), (?:), (?=), [] 圆括号和方括号   *, +, ?, {n}, {n,}, {n,m} 限定符   ^, $, anymetacharacter 位置和顺序   |    */ 

oracle正则表达式函数和正则表达式简介

标签:

小编还为您整理了以下内容,可能对您也有帮助:

oracle 正则表达式?=

Oracle使用正则表达式离不开这4个函数:
1、regexp_like
2、regexp_substr
3、regexp_instr
4、regexp_replace
regexp_like 只能用于条件表达式,和
like
类似,但是使用的正则表达式进行匹配,语法如下:
regexp_substr 函数,和
substr
类似,用于拾取合符正则表达式描述的字符子串,语法如下:
regexp_instr 函数,和
instr
类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:
regexp_replace 函数,和
replace
类似,用于替换符合正则表达式的字符串,语法如下:
解析一下几个参数的含义:
1、source_char,输入的字符串,可以是列名或者字符串常量、变量。
2、pattern,正则表达式。
3、match_parameter,匹配选项。
取值范围:
i:大小写不敏感;
c:大小写敏感;n:点号
.
不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。
4、position,标识从第几个字符开始正则表达式匹配。
5、occurrence,标识第几个匹配组。
6、replace_string,替换的字符串。

oracle 正则表达式?=

Oracle使用正则表达式离不开这4个函数:
1、regexp_like
2、regexp_substr
3、regexp_instr
4、regexp_replace
regexp_like 只能用于条件表达式,和
like
类似,但是使用的正则表达式进行匹配,语法如下:
regexp_substr 函数,和
substr
类似,用于拾取合符正则表达式描述的字符子串,语法如下:
regexp_instr 函数,和
instr
类似,用于标定符合正则表达式的字符子串的开始位置,语法如下:
regexp_replace 函数,和
replace
类似,用于替换符合正则表达式的字符串,语法如下:
解析一下几个参数的含义:
1、source_char,输入的字符串,可以是列名或者字符串常量、变量。
2、pattern,正则表达式。
3、match_parameter,匹配选项。
取值范围:
i:大小写不敏感;
c:大小写敏感;n:点号
.
不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。
4、position,标识从第几个字符开始正则表达式匹配。
5、occurrence,标识第几个匹配组。
6、replace_string,替换的字符串。

Oracle正则表达式

  Oracle g数据库内建了符合IEEE POSIX (Portable Operating System for Unix)标准的正则表达式 熟练使用正则表达式 可以写出简洁 强大的SQL语句

  正则表达式有几个优点优于常见的LIKE操作符和INSTR SUBSTR及REPLACE 函数的 这些传统的SQL 函数不便于进行模式匹配 只有LIKE 操作符通过使用%和_字符匹配 但LIKE不支持表达式的重复 复杂的更替 字符范围 字符列表和POSIX 字符类等等

  元字符(Meta Character)

  Sql代码

  ^            使表达式定位至一行的开头

  $            使表达式定位至一行的末尾

  *            匹配 次或更多次

  ?            匹配 次或 次

  +            匹配 次或更多次

  {m}          正好匹配 m 次

  {m }         至少匹配 m 次

  {m n}       至少匹配 m 次但不超过 n 次

  [:alpha:]    字母字符

  [:lower:]    小写字母字符

  [:upper:]    大写字母字符

  [:digit:]    数字

  [:alnum:]    字母数字字符

  [:space:]    空白字符(禁止打印) 如回车符 换行符 竖直制表符和换页符[:punct:]    标点字符

  [:cntrl:]    控制字符(禁止打印)

  [:print:]    可打印字符 | 分隔替换选项 通常与分组操作符 () 一起使用

  ( )          将子表达式分组为一个替换单元 量词单元或后向引用单元

  [char]       字符列表

  Oracle g提供了四个regexp function: REGEXP_LIKE REGEXP_REPLACE REGEXP_INSTR REGEXP_SUBSTR

  Sql代码

  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]]]])  其中各参数的含义为:

  Sql代码

  srcstr:        被查找的字符数据

  pattern:       正则表达式

  occurrence:    出现的次数 默认为

  position:      开始位置

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

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

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

  c case sensitive

  I case insensitive

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

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

  下面通过一些具体的例子来说明如何使用这四个函数 首先创建一个测试数据表

  Sql代码

  SQL> create table person (

     first_name varchar( )

     last_name varchar( )

     email varchar( )

     zip varchar( ));

  Table created

  SQL> insert into person values ( Steven Chen );

   row created

  SQL> insert into person values ( James Li || chr( ) || b d f );

   row created

  SQL> mit;

  Commit plete

  SQL> select * from person;

  FIRST_NAME LAST_NAME  EMAIL                ZIP

  

  Steven     Chen              

  James      Li               b d f

  

   REGEXP_LIKE

  Sql代码

  SQL> select zip as invalid_zip from person where regexp_like(zip [^[:digit:]] );

  INVALID_ZIP

  

   b d f

  SQL> select first_name from person where regexp_like(first_name ^S *n$ );

  FIRST_NAME

  

  Steven

  SQL> select first_name from person where regexp_like(first_name ^s *n$ );

  no rows selected

  SQL> select first_name from person where regexp_like(first_name ^s *n$ c );

  no rows selected

  SQL> select first_name from person where regexp_like(first_name ^s *n$ i );

  FIRST_NAME

  

  Steven

  SQL> select email from person where regexp_like(email ^james *$ );

  no rows selected

  SQL> select email from person where regexp_like(email ^james *$ n );

  EMAIL

  

  

  

  SQL> select email from person where regexp_like(email ^li *$ );

  no rows selected

  SQL> select email from person where regexp_like(email ^li *$ m );

  EMAIL

  

  

  

   REGEXP_INSTR

  Sql代码

  查找zip中第一个非数字字符的位置

  SQL> select regexp_instr(zip [^[:digit:]] ) as position from person;

  POSITION

  

  

  

  从第三个字符开始 查找zip中第二个非数字字符的位置

  SQL> select regexp_instr(zip [^[:digit:]] ) as position from person;

  POSITION

  

  

  

  从第三个字符开始 查找zip中第二个非数字字符的下一个字符位置

  SQL> select regexp_instr(zip [^[:digit:]] ) as position from person;

  POSITION

  

  

  

   REGEXP_SUBSTR

  Sql代码

  SQL> select regexp_substr(zip [^[:digit:]] ) as zip from person;

  ZIP

  

  b

  SQL> select regexp_substr(zip [^[:digit:]] ) as zip from person;

  ZIP

  

  f

   REGEXP_REPLACE

  Sql代码

  把zip中所有非数字字符替换为

  SQL> update person set zip=regexp_replace(zip [^[:digit:]] )

     where regexp_like(zip [^[:digit:]] );

   row updated

  SQL> select zip from person;

  ZIP

  

  

  

  后向引用(backreference)

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

  Sql代码

  SQL> select regexp_replace( Steven Chen ( *) ( *) ) as reversed_name from al;

  REVERSED_NAME

  

  Chen Steven

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

  Sql代码

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

lishixin/Article/program/Oracle/201311/18745

Oracle正则表达式

Oracle正则表达式的应用在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr 和regexp_replace。这里在我们oracle 10g里灵活应用。 先来简单介绍一下正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先,行的起始与结束 “^”这个字符是表示只查找行首的内容。“$”这个字符只查找行末的内容。接下来是“^”还可以做为一个排除字符来使用。还是使用例子来做一个演示比较明了一下。 这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多。select * from test_tablewhere regexp_like(field_1,'^1234')这个就是表示是以1234打头的字符串是不是有匹配的。这里和like的方式是一样的。 select * from test_tablewhere regexp_like(field_1,'^[12]234')这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。 select * from test_tablewhere regexp_like(field_1,'^(欧阳|李)小二')这里我们就可以表达,这个查询一个姓是欧阳或李的,名字叫小二的字符串。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。这里还有一个“|”来表示或的意思。 select * from test_tablewhere regexp_like(field_1,'^李[小]*二')这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配。这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。还有一个“?”来说表示1或是0个。 select * from test_tablewhere regexp_like(field_1,'李[^小]二')这里我们可以查询到姓李的,但是第二字不是“小”这个字。 select * from test_tablewhere regexp_like(field_1,'[0-9]')这里是表示我们查询字符串含有0-9的数字的字符串。 select * from test_tablewhere regexp_like(field_1,'[a-z]')这里是表示我们查询字符串含有a-z的小写字母的字符串。 select * from test_tablewhere regexp_like(field_1,'[A-z]')这里是表示我们查询字符串含有A-z的所有字母的字符串。 select * from test_tablewhere regexp_like(name,'[[:alpha:]]')这里是表示查询匹配任意字母,也包括中文字 select * from test_tablewhere regexp_like(name,'[[:alnum:]]')这里是表示查询匹配任意字母和数字 select * from test_tablewhere regexp_like(name,'[[:digit:]]')这里是表示查询匹配任意数字 Select * from test_tableWhere regexp_like(name,’of’,’i’)这里就是of不区分大小写 Select * from test_tableWhere regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)这样我们可以查询是不是ip格式 接下来介绍一下regexp_substr这个也是一个非常实用的一个函数 REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 注: srcstr 源字符串 pattern 正则表达式样式 position 开始匹配字符位置 occurrence 匹配出现次数 match_option 匹配选项(区分大小写) SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM al; Output: 1PSN [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM al; Output: 231 与上面一个例子相比,多了两个参数1 表示从源字符串的第一个字符开始查找匹配2 表示第2次匹配到的字符串(默认值是“1”,如上例) select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from al; Output: 231 @* 表示匹配0个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符注意:需要区别“+”和“*”的区别 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from al; Output: @@+ 表示匹配1个或者多个@ [[:alnum:]]* 表示匹配0个或者多个字母或数字字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from al; Output: /ABc [^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符 select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from al; Output: Tom_Kyte [^@]+ 表示匹配1个或者多个不是“@”的字符 select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from al; Output: Null [[:alnum:]]* 表示匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null” 这里我们有时候会查询字符串里asdfafd<main>dafda 这里我们要取出<main>这个字符串Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from alOutput: <main> 这里我们在<>中间去一个^>这样在匹配<之后,在向后查询的时候确保在匹配到>之前不再在有>,不然的话就要有可以出错的情况。 Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from alOutput: <main>da>在这个例子中,我们在<main>之后还在da>,这样的话,如果我们没有添加^>,正则表达式就会向后继续去匹配,直到最后一个>为至,这样就会出现偏差 这个通常用来实现字符串的列传行select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from alconnect by rownum <= length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1这里length这里操作是先得到有多少个“;”,再通过 connect by rownum方式来做一行成多行的操作,在变成多行之后,可以通过regexp_substr来取字符串的操作 接着上一个例子a,b,c,d,e,d,f,a,n这样的一个字符串,我们现在要把字符串里一些重复去掉,这样的话结果是a,b,c,d,e,f,n去掉了d与a的两个字符串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from alconnect by rownum<=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通过转成多行的,再用distinct 去掉重复,然后我们再通过wm_concat来字符串合并来完成。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5order by rownum) 来一个验证IP是数字是否正确select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5)where new_value>=0 and new_value<256having count(*) =4 来一个IP字符串格式转换成数字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from alconnect by rownum<=4) 接下来介绍一个regexp_instr函数 REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点。REGEXP_INSTR 的语法如下所示。REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置,如果没有发现匹配的值,则返回0。 语法: 2.REGEXP_INSTR与INSTR函数相同,返回字符串位置 REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 与REGEXP_SUBSTR一样,它也有变量pattern、position(开始位置)、occurrence 和match_parameter;这里主要介绍一下新参数return_option 的作用,它允许用户告诉Oracle,模式出现的时候,要返回什么内容。 Select regexp_instr('asdfafd<main>da>fda','sd') from alOutput:2这里去查询sd的位置,这个和instr是在相同的 Select regexp_instr('asdfafd<main>da>fda','da',1,2) from al这里是查询da第二出现的位置 还有我们经常会遇到一种情况是,查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'温州' ,'大城市','小城市') from al只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|温州)'),0,'小城市', '大城市') from al通过regexp_instr不匹配时为0的条件,这样就可以完成了 最后一个函数regexp_replaceREGEXP_REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REGEXP_REPLACE的格式如下所示 语法: 4.REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 这个替换函数还是一个非常好用的。如我们在有一个字符串adfadfa (main) next 现在我们要把()替换成<>,这里我们可能想用replace就可以搞定了,但是我们现在做的是(之后必须有)这样的()我们才替换把<>.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from aloutput: adfadfa <main> next这里还是一个\做为转义字符。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from aloutput: 012.019.168.027这里我分成两步来操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先让每个小字符串做添加0,这样每个字符串都会大于3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')这整个字符串分成8段,这样我们只要2、4、6、8这四个段就可以了。 下面一个例子中,在每两个字符之间插入一个空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM al; Output: Y A H O O这个用一个循环的方式去操作,还蛮很好的。 select regexp_replace(regexp_replace('12.19.168.27','([^.]+)','00\1') ,'([^.]*)([^.]{3})','\2')from al接着刚才那个,我们可以把replace循环替换的方式来操作。

Oracle正则表达式

Oracle正则表达式的应用在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr 和regexp_replace。这里在我们oracle 10g里灵活应用。 先来简单介绍一下正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先,行的起始与结束 “^”这个字符是表示只查找行首的内容。“$”这个字符只查找行末的内容。接下来是“^”还可以做为一个排除字符来使用。还是使用例子来做一个演示比较明了一下。 这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多。select * from test_tablewhere regexp_like(field_1,'^1234')这个就是表示是以1234打头的字符串是不是有匹配的。这里和like的方式是一样的。 select * from test_tablewhere regexp_like(field_1,'^[12]234')这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。 select * from test_tablewhere regexp_like(field_1,'^(欧阳|李)小二')这里我们就可以表达,这个查询一个姓是欧阳或李的,名字叫小二的字符串。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。这里还有一个“|”来表示或的意思。 select * from test_tablewhere regexp_like(field_1,'^李[小]*二')这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配。这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。还有一个“?”来说表示1或是0个。 select * from test_tablewhere regexp_like(field_1,'李[^小]二')这里我们可以查询到姓李的,但是第二字不是“小”这个字。 select * from test_tablewhere regexp_like(field_1,'[0-9]')这里是表示我们查询字符串含有0-9的数字的字符串。 select * from test_tablewhere regexp_like(field_1,'[a-z]')这里是表示我们查询字符串含有a-z的小写字母的字符串。 select * from test_tablewhere regexp_like(field_1,'[A-z]')这里是表示我们查询字符串含有A-z的所有字母的字符串。 select * from test_tablewhere regexp_like(name,'[[:alpha:]]')这里是表示查询匹配任意字母,也包括中文字 select * from test_tablewhere regexp_like(name,'[[:alnum:]]')这里是表示查询匹配任意字母和数字 select * from test_tablewhere regexp_like(name,'[[:digit:]]')这里是表示查询匹配任意数字 Select * from test_tableWhere regexp_like(name,’of’,’i’)这里就是of不区分大小写 Select * from test_tableWhere regexp_like(name,’^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$’)这样我们可以查询是不是ip格式 接下来介绍一下regexp_substr这个也是一个非常实用的一个函数 REGEXP_SUBSTR与SUBSTR函数相同,返回截取的子字符串 REGEXP_SUBSTR(srcstr, pattern [, position [, occurrence [, match_option]]]) 注: srcstr 源字符串 pattern 正则表达式样式 position 开始匹配字符位置 occurrence 匹配出现次数 match_option 匹配选项(区分大小写) SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+') FROM al; Output: 1PSN [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 SELECT regexp_substr('1PSN/231_3253/ABc', '[[:alnum:]]+', 1, 2) FROM al; Output: 231 与上面一个例子相比,多了两个参数1 表示从源字符串的第一个字符开始查找匹配2 表示第2次匹配到的字符串(默认值是“1”,如上例) select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from al; Output: 231 @* 表示匹配0个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符注意:需要区别“+”和“*”的区别 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from al; Output: @@+ 表示匹配1个或者多个@ [[:alnum:]]* 表示匹配0个或者多个字母或数字字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from al; Output: Null @+ 表示匹配1个或者多个@ [[:alnum:]]+ 表示匹配1个或者多个字母或数字字符 select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from al; Output: 125 [[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符 select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from al; Output: /ABc [^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符 select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from al; Output: Tom_Kyte [^@]+ 表示匹配1个或者多个不是“@”的字符 select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',1,2) from al; Output: Null [[:alnum:]]* 表示匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null” 这里我们有时候会查询字符串里asdfafd<main>dafda 这里我们要取出<main>这个字符串Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from alOutput: <main> 这里我们在<>中间去一个^>这样在匹配<之后,在向后查询的时候确保在匹配到>之前不再在有>,不然的话就要有可以出错的情况。 Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from alOutput: <main>da>在这个例子中,我们在<main>之后还在da>,这样的话,如果我们没有添加^>,正则表达式就会向后继续去匹配,直到最后一个>为至,这样就会出现偏差 这个通常用来实现字符串的列传行select regexp_substr('123;234;345;456;567;678;789','[^;]+',1,rownum) from alconnect by rownum <= length('123;234;345;456;567;678;789') - length(replace('123;234;345;456;567;678;789',';'))+1这里length这里操作是先得到有多少个“;”,再通过 connect by rownum方式来做一行成多行的操作,在变成多行之后,可以通过regexp_substr来取字符串的操作 接着上一个例子a,b,c,d,e,d,f,a,n这样的一个字符串,我们现在要把字符串里一些重复去掉,这样的话结果是a,b,c,d,e,f,n去掉了d与a的两个字符串select wm_concat(new_row) from (select distinct regexp_substr('a,b,c,d,e,d,f,a,n','[^,]+',1,rownum) new_row from alconnect by rownum<=length('a,b,c,d,e,d,f,a,n')-length(replace('a,b,c,d,e,d,f,a,n',',')))通过转成多行的,再用distinct 去掉重复,然后我们再通过wm_concat来字符串合并来完成。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select wm_concat(new_value) from (select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5order by rownum) 来一个验证IP是数字是否正确select count(*) from(select lpad(regexp_substr('12.19.168.27','[^.]+',1,rownum) ,3,'0') new_value,rownumfrom alconnect by rownum<5)where new_value>=0 and new_value<256having count(*) =4 来一个IP字符串格式转换成数字型IPselect sum(new_value*power(256,4-rm)) from (select regexp_substr('12.19.168.27','[^.]+',1,rownum) new_value,rownum rm from alconnect by rownum<=4) 接下来介绍一个regexp_instr函数 REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点。REGEXP_INSTR 的语法如下所示。REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置,如果没有发现匹配的值,则返回0。 语法: 2.REGEXP_INSTR与INSTR函数相同,返回字符串位置 REGEXP_INSTR(srcstr, pattern [, position [, occurrence [, return_option [,match_option]]]]) 与REGEXP_SUBSTR一样,它也有变量pattern、position(开始位置)、occurrence 和match_parameter;这里主要介绍一下新参数return_option 的作用,它允许用户告诉Oracle,模式出现的时候,要返回什么内容。 Select regexp_instr('asdfafd<main>da>fda','sd') from alOutput:2这里去查询sd的位置,这个和instr是在相同的 Select regexp_instr('asdfafd<main>da>fda','da',1,2) from al这里是查询da第二出现的位置 还有我们经常会遇到一种情况是,查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式 Select decode('上海','上海','大城市','北京' ,'大城市' ,'温州' ,'大城市','小城市') from al只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr('北京','^(上海|北京|温州)'),0,'小城市', '大城市') from al通过regexp_instr不匹配时为0的条件,这样就可以完成了 最后一个函数regexp_replaceREGEXP_REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REGEXP_REPLACE的格式如下所示 语法: 4.REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容 REGEXP_REPLACE(srcstr, pattern [,replacestr [, position [, occurrence [,match_option]]]]) 这个替换函数还是一个非常好用的。如我们在有一个字符串adfadfa (main) next 现在我们要把()替换成<>,这里我们可能想用replace就可以搞定了,但是我们现在做的是(之后必须有)这样的()我们才替换把<>.select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from aloutput: adfadfa <main> next这里还是一个\做为转义字符。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select regexp_replace(regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4') ,'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')from aloutput: 012.019.168.027这里我分成两步来操作,regexp_replace('12.19.168.27','([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})','00\1.00\2.00\3.00\4')我首先让每个小字符串做添加0,这样每个字符串都会大于3,再'([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}\.)([0-9]*)([0-9]{3}$)','\2\4\6\8')这整个字符串分成8段,这样我们只要2、4、6、8这四个段就可以了。 下面一个例子中,在每两个字符之间插入一个空格符SELECT regexp_replace('YAHOO', '(.)', '\1 ') AS output FROM al; Output: Y A H O O这个用一个循环的方式去操作,还蛮很好的。 select regexp_replace(regexp_replace('12.19.168.27','([^.]+)','00\1') ,'([^.]*)([^.]{3})','\2')from al接着刚才那个,我们可以把replace循环替换的方式来操作。

oracle SQL 正则表达式

用 Oracle Database 10g 使用正规表达式
  您可以使用最新引进的 Oracle SQL REGEXP_LIKE 操作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用。您将体会到这个新的功能如何对 LIKE 操作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充。实际上,它们类似于已有的操作符,但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性。
正规表达式的基本例子
  在使用这个新功能之前,您需要了解一些元字符的含义。句号 (.) 匹配一个正规表达式中的任意字符(除了换行符)。例如,正规表达式 a.b 匹配的字符串中首先包含字母 a,接着是其它任意单个字符(除了换行符),再接着是字母 b。字符串 axb、xaybx 和 abba 都与之匹配,因为在字符串中隐藏了这种模式。如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串,则您必须对正规表达式进行定位。脱字符号 (^) 元字符指示一行的开始,而美元符号 ($) 指示一行的结尾(参见表1:附表见第4页)。因此, 正规表达式 ^a.b$ 匹配字符串 aab、abb 或 axb。将这种方式与 LIKE 操作符提供的类似的模式匹配 a_b 相比较,其中 (_) 是单字符通配符。
  默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次。为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复操作符。.如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正规表达式看起来像这样:^a.*b$。* 元字符重复前面的元字符 (.) 指示的匹配零次、一次或更多次。LIKE 操作符的等价的模式是 a%b,其中用百分号 (%) 来指示任意字符出现零次、一次或多次。
  表 2 给出了重复操作符的完整列表。注意它包含了特殊的重复选项,它们实现了比现有的 LIKE 通配符更大的灵活性。如果您用圆括号括住一个表达式,这将有效地创建一个可以重复一定次数的子表达式。例如,正规表达式 b(an)*a 匹配 ba、bana、banana、yourbananasplit 等。仅供参考!

oracle SQL 正则表达式

用 Oracle Database 10g 使用正规表达式
  您可以使用最新引进的 Oracle SQL REGEXP_LIKE 操作符和 REGEXP_INSTR、REGEXP_SUBSTR 以及 REGEXP_REPLACE 函数来发挥正规表达式的作用。您将体会到这个新的功能如何对 LIKE 操作符和 INSTR、SUBSTR 和 REPLACE 函数进行了补充。实际上,它们类似于已有的操作符,但现在增加了强大的模式匹配功能。被搜索的数据可以是简单的字符串或是存储在数据库字符列中的大量文本。正规表达式让您能够以一种您以前从未想过的方式来搜索、替换和验证数据,并提供高度的灵活性。
正规表达式的基本例子
  在使用这个新功能之前,您需要了解一些元字符的含义。句号 (.) 匹配一个正规表达式中的任意字符(除了换行符)。例如,正规表达式 a.b 匹配的字符串中首先包含字母 a,接着是其它任意单个字符(除了换行符),再接着是字母 b。字符串 axb、xaybx 和 abba 都与之匹配,因为在字符串中隐藏了这种模式。如果您想要精确地匹配以 a 开头和以 b 结尾的一条三个字母的字符串,则您必须对正规表达式进行定位。脱字符号 (^) 元字符指示一行的开始,而美元符号 ($) 指示一行的结尾(参见表1:附表见第4页)。因此, 正规表达式 ^a.b$ 匹配字符串 aab、abb 或 axb。将这种方式与 LIKE 操作符提供的类似的模式匹配 a_b 相比较,其中 (_) 是单字符通配符。
  默认情况下,一个正规表达式中的一个单独的字符或字符列表只匹配一次。为了指示在一个正规表达式中多次出现的一个字符,您可以使用一个量词,它也被称为重复操作符。.如果您想要得到从字母 a 开始并以字母 b 结束的匹配模式,则您的正规表达式看起来像这样:^a.*b$。* 元字符重复前面的元字符 (.) 指示的匹配零次、一次或更多次。LIKE 操作符的等价的模式是 a%b,其中用百分号 (%) 来指示任意字符出现零次、一次或多次。
  表 2 给出了重复操作符的完整列表。注意它包含了特殊的重复选项,它们实现了比现有的 LIKE 通配符更大的灵活性。如果您用圆括号括住一个表达式,这将有效地创建一个可以重复一定次数的子表达式。例如,正规表达式 b(an)*a 匹配 ba、bana、banana、yourbananasplit 等。仅供参考!

什么是正则表达式?

假设用户需要在HTML表单中填写姓名、地址、出生日期等。那么在将表单提交到服务器进一步处理前,JavaScript程序会检查表单以确认用户确实输入了信息并且这些信息是符合要求的。

什么是正则表达式?

正则表达式(regularexpression)是一个描述字符模式的对象。ECMAScript的RegExp类表示正则表达式,而String和RegExp都定义了使用正则表达式进行强大的模式匹配和文本检索与替换的函数。

正则表达式主要用来验证客户端的输入数据。用户填写完表单单击按钮之后,表单就会被发送到服务器,在服务器端通常会用PHP、ASP.NET等服务器脚本对其进行进一步处理。因为客户端验证,北京IT培训认为可以节约大量的服务器端的系统资源,并且提供更好的用户体验。

什么是正则表达式

正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。

许多程序设计语言都支持利用正则表达式进行字符串操作。例如,在Perl中就内建了一个功能强大的正则表达式引擎。正则表达式这个概念最初是由Unix中的工具软件(例如sed和grep)普及开的。正则表达式通常缩写成“regex”,单数有regexp、regex,复数有regexps、regexes、regexen。

概念

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。

简介

正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,该模式描述在搜索文本时要匹配的一个或多个字符串。