Oracle正则表达式_小结
oracle中的支持正则表达式的函数主要有下面四个:
2,REGEXP_INSTR:与INSTR的功能相似 3,REGEXP_SUBSTR:与SUBSTR的功能相似 4,REGEXP_REPLACE:与REPLACE的功能相似 regexp_like 只能用于条件表达式,和 like 类似,但是使用的正则表达式进行匹配,语法很简单: regexp_substr 函数,和 substr 类似,用于拾取合符正则表达式描述的字符子串,语法如下: 上面这个模式参数就复杂了些 常用组合以下 regexp_substr(string,pattern,position)
regexp_instr 函数,和 instr 类似,用于标定符合正则表达式的字符子串的开始位置,语法如下: regexp_instr(string,pattern)
regexp_replace 函数,和 replace 类似,用于替换符合正则表达式的字符串,语法如下: 这里解析一下几个参数的含义: 1。source_char,输入的字符串,可以是列名或者字符串常量、变量。 2。pattern,正则表达式。 3。match_parameter,匹配选项取值范围: i:大小写不敏感; c:大小写敏感;n:点号 . 不匹配换行符号;m:多行模式;x:扩展模式,忽略正则表达式中的空白字符。 4。position,标识从第几个字符开始正则表达式匹配。 5。occurrence,标识第几个匹配组。 6。replace_string,替换的字符串。 在新的函数中使用正则表达式来代替通配符‘%’和‘_’。 正则表达式由标准的元字符(metacharacters)所构成: '^'匹配输入字符串的开始位置,在方括号表达式中使用,此时它表示不接受该字符集合。 $'匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配'n'或'r'。 .匹配除换行符n之外的任何单字符。 ?匹配前面的子表达式零次或一次。 +匹配前面的子表达式一次或多次。 *匹配前面的子表达式零次或多次。 '|'指明两项之间的一个选择。例子'^([a-z]+|[0-9]+)$'表示所有小写字母或数字组合成的字符串。 '( )'标记一个子表达式的开始和结束位置。 '[]'标记一个中括号表达式。 '{m,n}'一个精确地出现次数范围,m=<出现次数<=n,'{m}'表示出现m次,表示至少出现m次。 num匹配,其中num是一个正整数。对所获取的匹配的引用。 字符簇: [[:alpha:]]任何字母。 [[:digit:]]任何数字。 [[:alnum:]]任何字母和数字。 [[:space:]]任何白字符。 [[:upper:]]任何大写字母。 [[:lower:]]任何小写字母。 [[:punct:]]任何标点符号。 [[:xdigit:]]任何16进制的数字,相当于[0-9a-fA-F]各种操作符的运算优先级 转义符 (),(?:),(?=),[]圆括号和方括号 *,+,?,{n},{n,},m}限定符 ^,$,anymetacharacter位置和顺序 | “”操作 说了一堆文绉绉的,现在开始实例演练了,在此之前先建好一个表。 createtabletmpas withdataas( select'like'asid,'a9999'asstrfromdualunionall select'like','a9c'fromdualunionall select'like','A7007'fromdualunionall select'like','123a34cc'fromdualunionall select'substr','123,234,345'fromdualunionall select'substr','12,34.56:78'fromdualunionall select'substr','123456789'fromdualunionall select'instr','192.168.0.1'fromdualunionall select'replace','(020)12345678'fromdualunionall select'replace','001517729C28'fromdual ) select*fromdata; select*fromtmp; IDSTR -------------------- likea9999 likea9c likeA7007 like123a34cc substr123,345 substr12,34.56:78 substr123456789 instr192.168.0.1 replace(020)12345678 replace001517729C28 regexp_like 例子: selectstrfromtmpwhereid='like'andregexp_like(str,'Ad+','i');--'i'忽略大小写 STR ------------- a9999 a9c A7007 123a34cc selectstrfromtmpwhereid='like'andregexp_like(str,'ad+'); STR ------------- a9999 a9c 123a34cc selectstrfromtmpwhereid='like'andregexp_like(str,'^ad+'); STR ------------- a9999 a9c selectstrfromtmpwhereid='like'andregexp_like(str,'^ad+c$'); STR ------------- a9999 regexp_substr 例子: colstrformata15; select str,regexp_substr(str,'[^,]+')str,]+',1,1)str,2)str,--occurrence第几个匹配组 regexp_substr(str,2,1)str--position从第几个字符开始匹配 fromtmp whereid='substr'; STRSTRSTRSTRSTR --------------------------------------------------------------------------- 123,34512312323423 12,34.56:78121234.56:782 12345678912345678912345678923456789 select str,'d')str,'d+','d{2}','d{3}',1)str fromtmp whereid='substr'; STRSTRSTRSTRSTR --------------------------------------------------------------------------- 123,345112323234 12,34.56:7811234 123456789112345678934234 selectregexp_substr('123456789','d',level)str--取出每位数字,有时这也是行转列的方式 fromdual connectbylevel<=9 STR --------------- 1 2 3 4 5 6 7 8 9 regex_instr 例子: colindformat9999; select str,regexp_instr(str,'.')ind,'.',2)ind,5,2)ind fromtmpwhereid='instr'; STRINDINDIND ------------------------------ 192.168.0.14810 select regexp_instr('192.168.0.1',level)ind,--点号.所在的位置 regexp_instr('192.168.0.1',level)ind--每个数字的位置 fromdual connectbylevel<=9 INDIND ---------- 41 82 103 05 06 07 09 011 00 regex_replace 例子: select str,regexp_replace(str,'020','GZ')str,'(d{3})(d{3})','<21>')str--将第一、第二捕获组交换位置,用尖括号标识出来 fromtmp whereid='replace'; STRSTRSTR --------------------------------------------- (020)12345678(GZ)12345678(020)<456123>78 001517729C28001517729C28<517001>729C28 综合应用的例子: colrow_lineformata30; withsudokuas( select'020000080568179234090000010030040050040205090070080040050000060289634175010000020'asline fromdual ),tmpas( selectregexp_substr(line,'d{9}',level)row_line,levelcol fromsudoku connectbylevel<=9 ) selectregexp_replace(row_line,'(d)(d)(d)(d)(d)(d)(d)(d)(d)','123456789')row_line fromtmp ROW_LINE ------------------------------ 020000080 568179234 090000010 030040050 040205090 070080040 050000060 289634175 010000020 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |