网址1:http://blog.sina.com.cn/s/blog_a18b33080102wsdw.html
网址2:http://blog.csdn.net/jv_rookie/article/details/55211955
网址3:http://www.bkjia.com/yjs/858911.html
网址4:http://superlxw1234.iteye.com/blog/1751216
网址5:http://blog.csdn.net/longshenlmj/article/details/49027145
网址6:http://blog.sina.com.cn/s/blog_6ff05a2c0100voxd.html
网址7:http://www.178linux.com/768
函数描述:
regexp_extract(str,regexp[,idx]) - extracts a group that matches regexp
字符串正则表达式解析函数。
-- 这个函数有点类似于 substring(str from 'regexp') ..
参数解释:
其中:
str是被解析的字符串
regexp 是正则表达式
idx是返回结果 取表达式的哪一部分 默认值为1。
0表示把整个正则表达式对应的结果全部返回
1表示返回正则表达式中第一个() 对应的结果 以此类推
注意点:
要注意的是idx的数字不能大于表达式中()的个数。
实例:从表名DW_DM_LTE_USER_AGENT的表中,将user_agent字段中含有的iPhone手机版本信息大于9.2.1的信息提取出来,提取之后的结果为user_agent_new字段,如下:
上图的提取规则是:
含有iPhone(P可以是大写或小写);
iphone后为OS或iOS;
OS后为版本信息,有三个数字组成,中间可以用_或者.链接,且版本信息大于等于.2.1;
下面来看一下正则表达式的写法:
select city_code,imsi,imei,user_agent,
REGEXP_EXTRACT(user_agent,'((iPhone|iphone).*[OS].(9|1[0-9])[_|\.][2-9]{1} [_|\.][1-9]{1})',0) user_agent_new
from DW_DM_LTE_USER_AGENT
将每一项提取规则进行分解如下:
含有iPhone(P可以是大写或小写):
(iPhone|iphone)
iphone后为OS或iOS:
.*[OS]:这里.是另一个元字符,匹配除了换行符以外的任意字符。*同样是元字符,不过它代表的不是字符,也不是位置,而是数量——它指定*前边的内容可以连续重复使用任意次以使整个表达式得到匹配。因此,.*连在一起就意味着任意数量的不包含换行的字符。
OS后为版本信息,有三个数字组成,中间可以用_或者.链接,且版本信息大于等于9.2.1:
(9|1[0-9]):第一位数字版本信息大于等于9,|代表的含义是或,[0-9]代表0-9之间的任何一位数据,1[0-9]代表大于等于10的版本
[_|\.]:中间可以用_或者.链接
[2-9]{1} :版本的第二位数字,2-9之间的任何一位数据
[1-9]{1}):版本的第三位位数字,1-9之间的任何一位数据
所以最终的正则表达式结果就是:
(iPhone|iphone).*[OS].(9|1[0-9])[_|\.][2-9]{1} [_|\.][1-9]{1}