regexp substr函数(ORACLE REGEXP_SUBSTR截取字符串问题)
本文目录
- ORACLE REGEXP_SUBSTR截取字符串问题
- Oracle中的regexp_instr和regexp_substr这两个函数在SQL Server2008 中怎么实现
- regexp_substr如何截取报文中相同的两个节点的值
- Oracle正则表达式
- oracle 正则表达式=
- 如何在SQL Server中使用正则表达式
- sql语句regexp_substr(building_name,’[0-9]+[号楼|号|栋|#|座]’)里的[号楼|号|栋|#|座]是什么意思
ORACLE REGEXP_SUBSTR截取字符串问题
可以通过REGEXP_SUBSTR函数(配合正则表达式)来实现字符串截取。
举例:
sql:select regexp_substr(’CYJ8-ABC’,’+’) from dual;
以上sql执行结果:8;
备注:
REGEXP_SUBSTR函数格式如下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
__srcstr :需要进行正则处理的字符串
__pattern :进行匹配的正则表达式
__position :起始位置,从第几个字符开始正则表达式匹配(默认为1)
__occurrence :标识第几个匹配组,默认为1
__modifier :模式(’i’不区分大小写进行检索;’c’区分大小写进行检索。默认为’c’。)
Oracle中的regexp_instr和regexp_substr这两个函数在SQL Server2008 中怎么实现
sql server到现在为止,内在还不支持常规表达式。
如果你要使用,可以使用.net 语言编写clr函数来实现功能。
http://blog.csdn.net/jinjazz/article/details/4101746
regexp_substr如何截取报文中相同的两个节点的值
可以通过REGEXP_SUBSTR函数(配合正则表达式)来实现字符串截龋 举例: sql:select regexp_substr(’CYJ8-ABC’,’+’) from dual; 以上sql执行结果:8; 备注: REGEXP_SUBSTR函数格式如下: function REGEXP_SUBSTR(String, pattern
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,’^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的数字的字符串。 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,’^{1,3}.{1,3}.{1,3}.{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’,’@+[[: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(’@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:]]*’,1,2) from dual; Output: Null [[:alnum:]]* 表示匹配0个或者多个字母或者数字字符注:因为是匹配0个或者多个,所以这里第2次匹配的是“/”(匹配了0次),而不是“231”,所以结果是“Null” 这里我们有时候会查询字符串里asdfafd《main》dafda 这里我们要取出《main》这个字符串Select regexp_substr(’asdfafd《main》dafda’,’《[^》]+》’) from dualOutput: 《main》 这里我们在《》中间去一个^》这样在匹配《之后,在向后查询的时候确保在匹配到》之前不再在有》,不然的话就要有可以出错的情况。 Select regexp_substr(’asdfafd《main》da》fda’,’《[^《]+》’) from dualOutput: 《main》da》在这个例子中,我们在《main》之后还在da》,这样的话,如果我们没有添加^》,正则表达式就会向后继续去匹配,直到最后一个》为至,这样就会出现偏差 这个通常用来实现字符串的列传行select regexp_substr(’123;234;345;456;567;678;789’,’[^;]+’,1,rownum) from dualconnect 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 dualconnect 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 dualconnect by rownum《5order by rownum) 来一个验证IP是数字是否正确select count(*) from(select lpad(regexp_substr(’12.19.168.27’,’[^.]+’,1,rownum) ,3,’0’) new_value,rownumfrom dualconnect 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 dualconnect 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 dualOutput:2这里去查询sd的位置,这个和instr是在相同的 Select regexp_instr(’asdfafd《main》da》fda’,’da’,1,2) from dual这里是查询da第二出现的位置 还有我们经常会遇到一种情况是,查询某个字段,如果是等于“上海”或“北京”或者我们温州就写成大城市,其它的写成小城市,我们一般会考虑使用decode这种方式 Select decode(’上海’,’上海’,’大城市’,’北京’ ,’大城市’ ,’温州’ ,’大城市’,’小城市’) from dual只有两个我们可能觉的sql也不是很冗长,如果有四五个的话,就有点长了,这里使用regexp_instr就可以很多的去操作 Select decode (regexp_instr(’北京’,’^(上海|北京|温州)’),0,’小城市’, ’大城市’) from dual通过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 dualoutput: adfadfa 《main》 next这里还是一个\做为转义字符。 再来一个ip格式转换的例子吧,我们一般的IP的格式是12.19.168.27现在要不足3位的补足前面为0,结果是012.019.168.027select regexp_replace(regexp_replace(’12.19.168.27’,’({1,3}).({1,3}).({1,3}).({1,3})’,’00\1.00\2.00\3.00\4’) ,’(*)({3}\.)(*)({3}\.)(*)({3}\.)(*)({3}$)’,’\2\4\6\8’)from dualoutput: 012.019.168.027这里我分成两步来操作,regexp_replace(’12.19.168.27’,’({1,3}).({1,3}).({1,3}).({1,3})’,’00\1.00\2.00\3.00\4’)我首先让每个小字符串做添加0,这样每个字符串都会大于3,再’(*)({3}\.)(*)({3}\.)(*)({3}\.)(*)({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循环替换的方式来操作。
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,替换的字符串。
如何在SQL Server中使用正则表达式
sqlserver中,主要有regexp_like,regexp_replace,regexp_substr,regexp_instr四个正则表达式函数。
1、regexp_like:
regexp_like(x,pattern[,match_option]),查看x是否与pattern相匹配,该函数还可以提供一个可选的参数match_option字符串说明默认的匹配选项。match_option的取值如下:
’c’
说明在进行匹配时区分大小写(缺省值);
’i’
说明在进行匹配时不区分大小写;
’n’
(.)点号能表示所有单个字符,包括换行(俺还不知道什么地方有用到换行.只知道sql里面可以用chr(10)表示换行、
’m’
字符串存在换行的时候当作多行处理.这样$就可匹配每行的结尾.不然的话$只匹配字符串最后的位置、
示例:
select
*
from
emp
where
regexp_like(ename,’^a[a-z]*n$’);
可以查找ename中以a开头以n结尾的行.例如ename为arwen或arwin或anden.但Arwen不能被匹配.因为默认是区分大小写.如果是
select
*
from
emp
where
regexp_like(ename,’^a[a-z]*n$’,’i’)
则可以查找ename为Arwen的行记录。
2、regexp_instr:
REGEXP_INSTR(x,pattern[,start[,occurrence[,return_option[,
match_option]]]])用于在x中查找pattern。返回pattern在x中出现的位置。匹配位置从1开始。可以参考字符串函数
INSTR(),参数相关:
’start’
开始查找的位置;
’occurrence’
说明应该返回第几次出现pattern的位置;
’return_option’
说明应该返回什么整数。若该参数为0,则说明要返回的整数是x中的一个字符的位置;若该参数为非0的整数,则说明要返回的整数为x中出现在pattern之后
的字符的位置;
’match_option’
修改默认的匹配设置.与regexp_like里面的相同.
示例:
DECLARE
V_RESULT
INTEGER
;
BEGIN
SELECT
REGEXP_INSTR(’hello
world’,’o’,1,1,0)
INTO
V_RESULT
FROM
DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
结果为5,即字母o第一个次出现的位置。
如果regexp_instr(’hello
world’,’o’,1,1,n)其中n为除0之外的整数。比如1,3。则结果为6.表示第一次出现字母o的后面一个字符的位置。
如果regexp_instr(’hello
world’,’o’,1,2,0)则结果为9.表示第二次出现字母o的位置.
3、regexp_replace:
REGEXP_REPLACE(x,pattern[,replace_string[,start[,occurrence[,
match_option]]]])用于在x中查找pattern,并将其替换为replae_string。可以参考字符串函数
REPLACE(),参数同REGEXP_INSTR函数
示例:
DECLARE
V_RESULT
varchar2(90);
BEGIN
SELECT
REGEXP_REPLACE(’hello
world’,’o’,’x’,1,1)
INTO
V_RESULT
FROM
DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END;
结果为hellx
world.
如果REGEXP_REPLACE(’hello
world’,’o’,’x’),则结果为hellx
wxrld.
如果
REGEXP_REPLACE(’hello
world’,’o’,’x’,1,2)则结果为hello
wxrld.
4、regexp_substr:
REGEXP_SUBSTR(x,pattern[,start[,occurrence[,
match_option]]])用于在x中查找pattern并返回。可以参考字符串函数
SUBSTR(),参数同REGEXP_INSTR函数.
例如:
DECLARE
V_RESULT
VARCHAR2(255);
BEGIN
SELECT
REGEXP_SUBSTR(’hello
world’,’l{2}’)
INTO
V_RESULT
FROM
DUAL;
DBMS_OUTPUT.PUT_LINE(V_RESULT);
END
;
结果为ll
查询到匹配的字符串才返回匹配的字符.没查到就返回空。
sql语句regexp_substr(building_name,’[0-9]+[号楼|号|栋|#|座]’)里的[号楼|号|栋|#|座]是什么意思
“|“符号在正则表式里是 “或者” 的意思。
regexp_substr(building_name,’+[号楼|号|栋|#|座]’)
这句正则表达的是,在building_name里找一位数如果后面是“号楼”或者“号”或者“栋”再或者“#”还或者“座”都数找到并匹配成功。。
更多文章:
网络聊天室的设计与实现(我想要做一个网络聊天室,不知道怎么开始做)
2023年9月10日 13:40
通讯录管理系统c语言课程设计(用c语言编写一个通讯录管理系统)
2024年6月29日 00:21
免费的字体边框样式下载(photoshop如何做边框图片,photoshop的字体可以从哪里下载)
2024年6月28日 00:26
什么情况下用函数指针(什么情况下是必须使用指针的请举一两个例子)
2024年7月29日 16:35
当前无法进入匹配序列(dota2组队显示当前时间无法进入匹配队列)
2024年5月31日 21:46
dhtml的动态内容的作用是(如何用DHTML语言编制网页)
2024年9月9日 07:40
html表格插入图片(html <table>中建立的表格里面不能用加图片吗能的话,怎么加)
2024年7月11日 17:12
laptop显卡(惠普pavilion laptop 15 显卡MX250多少钱)
2023年7月5日 10:40