正则表达式(转载)

前端之家收集整理的这篇文章主要介绍了正则表达式(转载)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
今天看到一个正则表达式口诀,发上来学习一下: 正则其实也势利,削尖头来把钱揣; (指开始符号^和结尾符号$)
特殊符号认不了,弄个倒杠来引路; (指. *等特殊符号)
倒杠后面跟小w, 数字字母来表示; (w跟数字字母;d跟数字)
倒杠后面跟小d, 只有数字来表示;
倒杠后面跟小a, 报警符号嘀一声;
倒杠后面跟小b, 单词分界或退格;
倒杠后面跟小t, 制表符号很明了;
倒杠后面跟小r, 回车符号知道了;
倒杠后面跟小s, 空格符号很重要;
小写跟罢跟大写,多得实在不得了;
倒杠后面跟大W, 字母数字靠边站;
倒杠后面跟大S, 空白也就靠边站; 倒杠后面跟大D, 数字从此靠边站; 倒框后面跟大B, 不含开头和结尾;
单个字符要重复,三个符号来帮忙;
0 星加1 到无穷,问号只管0 和1; (*表0-n;+表1-n;?表0-1次重复)
花括号里学问多,重复操作能力强; 若要重复字符串,园括把它括起来; ((abc){3} 表示字符串“abc”重复3次 )
特殊集合自定义,中括号来帮你忙;
转义符号行不通,一个一个来排队;
实在多得排不下,横杠请来帮个忙; 尖头放进中括号,反义定义威力大; ([^a]指除“a”外的任意字符 )
1竖作用可不小,两边正则互替换; ( 键盘上与“/”是同一个键)
1竖能用很多次,复杂定义很方便;

园括号,用途多;

反向引用指定组,数字排符对应它; (“b(w+)bs+1b”中的数字“1”引用前面的“(w+)”)
支持组名自定义,问号加上尖括号; (“(?w+)”中把“w+”定义为组,组名为“Word”)
园括号,用途多,位置指定全靠它;
问号等号字符串,定位字符串前面; (“bw+(?=ingb)”定位“ing”前面的字符串)
若要定位串后面,中间插个小于号; (“(?<=bsub)w+b”定位“sub”后面的字符串)
问号加个惊叹号,后面跟串字符串;
PHPer都知道, !是取反的意思;
后面不跟这一串,统统符合来报到; (“w*d(?!og)w*”,“dog”不符合,“do”符合)
问号小于惊叹号,后面跟串字符串;
前面不放这一串,统统符合来报到;
点号星号很贪婪,加个问号不贪婪;
加号问号有保底,至少重复一次多; 两个问号老规矩,0次1次团团转;
花括号后跟个?,贪婪变成不贪婪;
还有很多装不下,等着以后来增加


正则表达式语法

***正则表达式语法 (字符匹配语法,重复匹配语法,字符定位语法,转义匹配语法)********
  1(字符
  \ 将下一个字符标记为一个非凡字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。
  . 匹配除了换行符以外的任意字符
  | 把不同的规则分隔开 例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。
  - 只作为连字号
  \s 匹配任意的空白符,包括空格,制表符(Tab),换行符,中文全角空格等。
  \w 匹配字母或数字或下划线或汉字
  \W 匹配任意不是字母,数字,下划线,汉字的字符
  \S 匹配任意不是空白符的字符
  \D 匹配任意非数字的字符
  \d 匹配任意数字
  [a-c] 匹配括号中任意字符a,b,c
  [^x] 匹配除了x以外的任意字符
  [^aeIoU] 匹配除了aeIoU这几个字母以外的任意字符
  [] 自定义字符
  2(定位
  $ 匹配字符串的结束(前面模式位于字符串末端) 比如:^\d{5,12}$ 表示为必须为5位到12位数字
  ^ 匹配字符串的开始(定位后面模式开始位置)
  \B 匹配不是单词开头或结束的位置(匹配一个非单词边界)
  \b 代表单词的开头或结尾,也就是单词的分界处(匹配一个单词边界) 比如\bhi\b
  \A 前面模式开始位置
  \z 前面模式结束位置
  \Z 前面模式结束位置(换行前)
  3(重复
  {n} 表示前面的字符必须连续重复匹配n次
  + 匹配重复1次或更多次
  * 表示任意数量(可能是0次)
  ? 重复零次或一次
  {n,m} 重复的次数不能少于n次,不能多于m次
  {n,} 重复n次或更多次 比如: \(?0\d{2}[) -]?\d{8}。匹配(010)88886666,或022-22334455,或02912345678
  *? 重复任意次,但尽可能少重复
  +? 重复1次或更多次,但尽可能少重复
  ?? 重复0次或1次,但尽可能少重复
  {n,m}? 重复n到m次,但尽可能少重复
  {n,}? 重复n次以上,但尽可能少重复
  4(转义
  \n 匹配换行
  \r 匹配回车
  \t 匹配水平制表符
  \v 匹配垂直制表符
  \f 匹配换页
  \nnn 匹配一个8进制ASCII
  \xnn 匹配一个16进制ASCII
  \unnnn 匹配4个16进制的Uniode
  \c+大写字母 匹配Ctrl-大写字母 例如:\cS-匹配Ctrl+S
  (exp) 匹配exp,并捕获文本到自动命名的组里
  (?exp) 匹配exp,并捕获文本到名称为name的组里,也可以写成(?'name'exp)
  (?:exp) 匹配exp,不捕获匹配的文本,也不给此分组分配组号
  (?=exp) 匹配exp前面的位置
  (?<=exp) 匹配exp后面的位置
  (?!exp) 匹配后面跟的不是exp的位置
  (?   (?#comment) 这种类型的组不对正则表达式的处理产生任何影响,用于提供注释让人阅读 比如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)。
  (?'group') 把捕获的内容命名为group,并压入堆栈
  (?'-group') 从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  (?(group)yes|no) 如果堆栈上存在以名为group的捕获内容的话,继续匹配yes部分的表达式,否则继续匹配no部分
  (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败
  \ 这是引用府,用来将这里列出的这些元字符当作普通的字符来进行匹配。
  \< \> 匹配词(word)的开始(\<)和结束(\>)。
  \( \) 将 \( 和 \) 之间的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域(一个正则表达式中最多可以保存9个),它们可以用 \1 到\9 的符号来引用。
  IgnoreCase(忽略大小写) 匹配时不区分大小写。
  Multiline(多行模式) 更改^和$的含义,使它们分别在任意一行的行首和行尾匹配,而不仅仅在整个字符串的开头和结尾匹配。(在此模式下,$的精确含意是:匹配\n之前的位置以及字符串
  结束前的位置.)
  Singleline(单行模式) 更改.的含义,使它与每一个字符匹配(包括换行符\n)。
  IgnorePatternWhitespace(忽略空白) 忽略表达式中的非转义空白并启用由#标记的注释。
  RightToLeft(从右向左查找) 匹配从右向左而不是从左向右进行。
  ExplicitCapture(显式捕获) 仅捕获已被显式命名的组。
  ECMAScript(JavaScript兼容模式) 使表达式的行为与它在JavaScript里的行为一致。
  C#构造正则表达式需要涉及Regex类,在Regex类中包括:IsMatch()匹配、Replace()替换、Split()拆分和Match的类;
  public static bool isEmail(string sEmail)
  {
  if (string.IsNullOrEmpty(sEmail)) { return true; }
  return (new Regex("[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$").IsMatch(sEmail));
  }
  ****正则表达式实例**********
  匹配双字节字符(包括汉字在内):[^\x00-\xff]
  评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1)
  匹配空白行的正则表达式:\n\s*\r
  评注:可以用来删除空白行
  匹配HTML标记的正则表达式:<(\S*?)[^>]*>.*?|<.*? />
  评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
  匹配首尾空白字符的正则表达式:^\s*|\s*$
  评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
  匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
  评注:表单验证时很实用
  匹配网址URL的正则表达式:[a-zA-z]+://[^\s]*
  评注:网上流传的版本功能很有限,上面这个基本可以满足需求
  匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  评注:表单验证时很实用
  匹配国内电话号码:\d{3}-\d{8}|\d{4}-\d{7}
  评注:匹配形式如 0511-4405222 或 021-87888822
  匹配腾讯QQ号:[1-9][0-9]{4,}
  评注:腾讯QQ号从10000开始
  匹配中国邮政编码:[1-9]\d{5}(?!\d)
  评注:中国邮政编码为6位数字
  匹配身份证:\d{15}|\d{18}
  评注:中国的身份证为15位或18位
  匹配ip地址:\d+\.\d+\.\d+\.\d+
  评注:提取ip地址时有用
  匹配特定数字:
  ^[1-9]\d*$    //匹配正整数
  ^-[1-9]\d*$   //匹配负整数
  ^-?[1-9]\d*$   //匹配整数
  ^[1-9]\d*|0$  //匹配非负整数(正整数 + 0)
  ^-[1-9]\d*|0$   //匹配非正整数(负整数 + 0)
  ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$   //匹配正浮点数
  ^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$  //匹配负浮点数
  ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$  //匹配浮点数
  ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$   //匹配非负浮点数(正浮点数 + 0)
  ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$  //匹配非正浮点数(负浮点数 + 0)
  匹配特定字符串:
  ^[A-Za-z]+$  //匹配由26个英文字母组成的字符串
  ^[A-Z]+$  //匹配由26个英文字母的大写组成的字符串
  ^[a-z]+$  //匹配由26个英文字母的小写组成的字符串
  ^[A-Za-z0-9]+$  //匹配由数字和26个英文字母组成的字符串
  ^\w+$  //匹配由数字、26个英文字母或者下划线组成的字符串



验证手机号码和电话号码的正则表达式

电话号码正则表达式(支持手机号码,3-4位区号,7-8位直播号码,1-4位分机号) ((\d{11})|^((\d{7,8})|(\d{4}|\d{3})-(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1})|(\d{7,8})-(\d{4}|\d{3}|\d{2}|\d{1}))$)

匹配格式:
11位手机号码
3-4位区号,7-8位直播号码,1-4位分机号
如:12345678901、1234-12345678-1234







"^\d+$"  //非负整数(正整数 + 0)
"^[0-9]*[1-9][0-9]*$"  //正整数
"^((-\d+)|(0+))$"  //非正整数(负整数 + 0)
"^-[0-9]*[1-9][0-9]*$"  //负整数
"^-?\d+$"    //整数
"^\d+(\.\d+)?$"  //非负浮点数(正浮点数 + 0)
"^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数
"^((-\d+(\.\d+)?)|(0+(\.0+)?))$"  //非正浮点数(负浮点数 + 0)
"^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点

"^(-?\d+)(\.\d+)?$"  //浮点数
"^[A-Za-z]+$"  //由26个英文字母组成的字符串
"^[A-Z]+$"  //由26个英文字母的大写组成的字符串
"^[a-z]+$"  //由26个英文字母的小写组成的字符串
"^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串
"^\w+$"  //由数字、26个英文字母或者下划线组成的字符串
"^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$"    //email地址
"^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$"  //url
/^13\d{9}$/gi手机号正则表达式


public static bool IsValidMobileNo(string MobileNo)
{
const string regPattern = @"^(130|131|132|133|134|135|136|137|138|139)\d{8}$";
return Regex.IsMatch(MobileNo,regPattern);
}


正则表达式--验证手机号码:13[0-9]{9}
实现手机号前带86或是+86的情况:^((\+86)|(86))?(13)\d{9}$
电话号码与手机号码同时验证:(^(\d{3,4}-)?\d{7,8})$|(13[0-9]{9})
提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
提取信息中的图片链接:(s|S)(r|R)(c|C) *= *('|")?(\w|\\|\/|\.)+('|"| *|>)?
提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
提取信息中的中国手机号码:(86)*0*13\d{9}
提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}-|\s)?\d{7,14}
提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
提取信息中的中国身份证号码:\d{18}|\d{15}
提取信息中的整数:\d+
提取信息中的浮点数(即小数):(-?\d*)\.?\d+
提取信息中的任何数字 :(-?\d*)(\.\d+)?
提取信息中的中文字符串:[\u4e00-\u9fa5]*
提取信息中的双字节字符串 (汉字):[^\x00-\xff]*


需求:

匹配手机号,第一位可以是+,可以没有+,后面的全部要是数字,如:

+861359415665

8613659558555

1356856455

都是合法的。

+aa156945555

aa1359556666

aaddssdfdfsd

都是不合法的。

正则:

  1. sql>SELECT*FROMDUALWHEREregexp_like('+333333','^[\+]*[[:digit:]]+');--该+转义或者不转义,结果是一样的
  2. DUMMY
  3. -----
  4. X


  1. sql>SELECT*FROMDUALWHEREregexp_like('aa333333','^[+]*[[:digit:]]+');
  2. DUMMY
  3. -----


解释:

1.^代表开始,*表示出现0次或多次,+表示出现1次或多次,[:digit:]代表0-9的纯数字(还有$代表以什么结尾,如果是[[:digit:]]+$代表以数字结尾)。该正则的意思就是:

以+0次或多次开头,紧接着后面数字出现一次或多次(即一定要有数字)。

2.dual表中,永远只有1行记录。查询出dual中有记录,证明where条件成立,反之不成立。

先前写了一个错误的正则:

  1. [\+]*[[:digit:]]+

注意,就只少了一个代表开始符号的^。少了这个符号,说明这个正则的意思是:

+出现0次或多次(即+可以出现,可以不出现!!),紧后面的数字出现1次或多次。前面已经+可以出现0次了,证明没有+也可以,那么就是只要字符串中有数字(+aa111a,aass11111……),这个正则恒成立,错误深重啊!!

Oracle正则表达式的应用by 温州--名次

在oracle里正则表达式有四个函数可用,分别是regexp_like、regexp_substr、regexp_instr 和regexp_replace。这里在我们oracle 10g里灵活应用。

先来简单介绍一下正则表达式的内容,正则表达式是做为快速查询的文本内容的,在linux应用比较多,首先,行的起始与结束 “^”这个字符是表示只查找行首的内容。“$”这个字符只查找行末的内容。接下来是“^”还可以做为一个排除字符来使用。还是使用例子来做一个演示比较明了一下。

这里我使用regexp_like这个函数来做,这样可以我们平时会使用的比较多。

select * from test_table

where regexp_like(field_1,'^1234')

这个就是表示是以1234打头的字符串是不是有匹配的。这里和like的方式是一样的。

select * from test_table

where regexp_like(field_1,'^[12]234')

这里多了一个[]这里做一个独立字符,这里表示是以1或2开始,并且接着是234这个里的字符就会是匹配的。

select * from test_table

where regexp_like(field_1,'^(欧阳|李)小二')

这里我们就可以表达,这个查询一个姓是欧阳或李的,名字叫小二的字符串。这里多了一个()这个是做一个为字符串的方式来写的与[]刚好是对应。

这里还有一个“|”来表示或的意思。

select * from test_table

where regexp_like(field_1,'^李[小]*二')

这里我们就可以查询李小二或是李二,再或者是李小小二,都可以,这里我们需要讲一下是[]后面带了一个*,这个是表示0~无穷大 字符去匹配。这个[]我们还可以添加一个“+”来表示1~无穷大的字符去匹配,也可以更加精准一些,在[]后面{1,3}这里就是表示1个到3个相同字符的匹配。还有一个“?”来说表示1或是0个。

select * from test_table

where regexp_like(field_1,'李[^小]二')

这里我们可以查询到姓李的,但是第二字不是“小”这个字。

select * from test_table

where regexp_like(field_1,'[0-9]')

这里是表示我们查询字符串含有0-9的数字的字符串。

select * from test_table

where regexp_like(field_1,'[a-z]')

这里是表示我们查询字符串含有a-z的小写字母的字符串。

select * from test_table

where regexp_like(field_1,'[A-z]')

这里是表示我们查询字符串含有A-z的所有字母的字符串。

select * from test_table

where regexp_like(name,'[[:alpha:]]')

这里是表示查询匹配任意字母,也包括中文

select * from test_table

where regexp_like(name,'[[:alnum:]]')

这里是表示查询匹配任意字母和数字

select * from test_table

where regexp_like(name,'[[:digit:]]')

这里是表示查询匹配任意数字

Select * from test_table

Where regexp_like(name,’of’,’i’)

这里就是of不区分大小写

Select * from test_table

Where regexp_like(name,’^[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 dual;

Output: 1PSN

[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符

SELECT regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]+',1,2) FROM dual;

Output: 231

与上面一个例子相比,多了两个参数

1 表示从源字符串的第一个字符开始查找匹配

2 表示第2次匹配到的字符串(默认值是“1”,如上例)

select regexp_substr('@@/231_3253/ABc','@*[[:alnum:]]+') from dual;

Output: 231

@* 表示匹配0个或者多个@

[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符

注意:需要区别“+”和“*”的区别

select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]*') from dual;

Output: @

@+ 表示匹配1个或者多个@

[[:alnum:]]* 表示匹配0个或者多个字母或数字字符

select regexp_substr('1@/231_3253/ABc','@+[[:alnum:]]+') from dual;

Output: Null

@+ 表示匹配1个或者多个@

[[:alnum:]]+ 表示匹配1个或者多个字母或数字字符

select regexp_substr('@1PSN/231_3253/ABc125','[[:digit:]]+$') from dual;

Output: 125

[[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符

select regexp_substr('1@/231_3253/ABc','[[:digit:]]+$') from dual;

Output: 125

[[:digit:]]+$ 表示匹配1个或者多个数字结尾的字符

select regexp_substr('@1PSN/231_3253/ABc','[^[:digit:]]+$') from dual;

Output: /ABc

[^[:digit:]]+$ 表示匹配1个或者多个不是数字结尾的字符

select regexp_substr('Tom_Kyte@oracle.com','[^@]+') from dual;

Output: Tom_Kyte

[^@]+ 表示匹配1个或者多个不是“@”的字符

select regexp_substr('1PSN/231_3253/ABc','[[:alnum:]]*',2)

from dual;

Output: Null

[[:alnum:]]* 表示匹配0个或者多个字母或者数字字符

注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null”

这里我们有时候会查询字符串里asdfafd<main>dafda 这里我们要取出<main>这个字符串

Select regexp_substr('asdfafd<main>dafda','<[^>]+>') from dual

Output: <main>

这里我们在<>中间去一个^>这样在匹配<之后,在向后查询的时候确保在匹配到>之前不再在有>,不然的话就要有可以出错的情况。

Select regexp_substr('asdfafd<main>da>fda','<[^<]+>') from dual

Output: <main>da>

在这个例子中,我们在<main>之后还在da>,这样的话,如果我们没有添加^>,正则表达式就会向后继续去匹配,直到最后一个>为至,这样就会出现偏差

这个通常用来实现字符串的列传行

select regexp_substr('123;234;345;456;567;678;789','[^;]+',rownum) from dual

connect 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,c,d,e,f,a,n这样的一个字符串,我们现在要把字符串里一些重复去掉,这样的话结果是a,n去掉了d与a的两个字符串

select wm_concat(new_row) from (

select distinct regexp_substr('a,n','[^,]+',rownum) new_row from dual

connect by rownum<=length('a,n')-length(replace('a,',')))

通过转成多行的,再用distinct 去掉重复,然后我们再通过wm_concat来字符串合并来完成。

再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027

select wm_concat(new_value) from (

select

lpad(regexp_substr('12.19.168.27','[^.]+',rownum),3,'0') new_value,rownum

from dual

connect by rownum<5

order by rownum)

来一个验证IP是数字是否正确

select count(*) from(

select

lpad(regexp_substr('12.19.168.27',rownum

from dual

connect by rownum<5)

where new_value>=0 and new_value<256

having count(*) =4

来一个IP字符串格式转换成数字型IP

select sum(new_value*power(256,4-rm)) from (

select regexp_substr('12.19.168.27',rownum) new_value,rownum rm from dual

connect by rownum<=4

)

接下来介绍一个regexp_instr函数

REGEXP_INSTR 函数使用正则表达式返回搜索模式的起点和终点。REGEXP_INSTR 的语法如下所示。REGEXP_INSTR 返回一个整数,指出搜索模式的开始或结束的位置,如果没有发现匹配的值,则返回0。

语法:

2.REGEXP_INSTR与INSTR函数相同,返回字符串位置

REGEXP_INSTR(srcstr,return_option [,match_option]]]])

与REGEXP_SUBSTR一样,它也有变量pattern、position(开始位置)、occurrence 和match_parameter;这里主要介绍一下新参数return_option 的作用,它允许用户告诉Oracle,模式出现的时候,要返回什么内容

Select regexp_instr('asdfafd<main>da>fda','sd') from dual

Output:2

这里去查询sd的位置,这个和instr是在相同的

Select regexp_instr('asdfafd<main>da>fda','da',2) from dual

这里是查询da第二出现的位置

还有我们经常会遇到一种情况是,查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式

Select decode('上海','上海','大城市','北京','温州','小城市') from dual

只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作

Select decode (regexp_instr('北京','^(上海|北京|温州)'),'小城市','大城市') from dual

通过regexp_instr不匹配时为0的条件,这样就可以完成了

最后一个函数regexp_replace

REGEXP_REPLACE 函数是用另外一个值来替代串中的某个值。例如,可以用一个匹配数字来替代字母的每一次出现。REGEXP_REPLACE的格式如下所示

语法:

4.REGEXP_REPLACE与REPLACE函数相同,替换原字符串中的字符内容

REGEXP_REPLACE(srcstr,replacestr [,match_option]]]])

这个替换函数还是一个非常好用的。

如我们在有一个字符串adfadfa (main) next 现在我们要把()替换成<>,这里我们可能想用replace就可以搞定了,但是我们现在做的是(之后必须有)这样的()我们才替换把<>.

select regexp_replace('adfadfa (main) next ','(\()([^\)]*)(\))','<\2>') from dual

output: adfadfa <main> next

这里还是一个\做为转义字符。

再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027

select regexp_replace(

regexp_replace('12.19.168.27','([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 dual

output: 012.019.168.027

这里我分成两步来操作,regexp_replace('12.19.168.27',

'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 dual;

Output: Y A H O O

这个用一个循环的方式去操作,还蛮好的。

select regexp_replace(

regexp_replace('12.19.168.27','([^.]+)'

,'00\1')

,'([^.]*)([^.]{3})','\2')

from dual

接着刚才那个,我们可以把replace循环替换的方式来操作。




转自:http://www.cnblogs.com/jhxk/articles/2275673.html

http://blog.csdn.net/wanglilin/article/details/7185167

猜你在找的正则表达式相关文章