0.正则表达式中 .* 与 .*? 的区别
简单说是贪婪匹配与非贪婪匹配的区别。
比如说匹配输入串A: 101000000000100
使用 1.*1 将会匹配到1010000000001, 匹配方法: 先匹配至输入串A的最后, 然后向前匹配, 直到可以匹配到1, 称之为贪婪匹配。
使用 1.*?1 将会匹配到101, 匹配方法: 匹配下一个1之前的所有字符, 称之为非贪婪匹配。
1.数字结尾
aa_[0-9]{1,4}$
匹配0-9的数字,出现1到4次,并且是数字结尾才能匹配
aa_[0-9]{1,4}
匹配0-9的数字,出现1到4次
aa_[0-9]*
匹配0-9的数字,0次、1次或多次
2.替换字符串中的特殊字符
将字符串中的括号替换掉
select REGEXP_REPLACE('(40.16000295057893,116.26745894551277)','[(|)]','');
select replace(replace(replace('[{"name":"ding","city":"shanghai"},{"name":"ding2","city":"shanghai2"}]','[',''),']',''),'},','}-'); --shanghai
select replace(regexp_replace('[{"name":"ding","city":"shanghai"},{"name":"ding2","city":"shanghai2"}]','[\\[|\\]]',''),'},','}-') --shanghai
//去除掉接口返回中的[],下面两种方法均可,注意一定要用两个反斜杠\\,否则就会有问题
REGEXP_REPLACE('\\[|\\]','')
REGEXP_REPLACE'(\\[|\\])','')
3.替换掉所有数字
select REGEXP_REPLACE('我们123213好','[0-9]*','');
4.找到文本中特殊字符
(1)在字符串"这是顾客小李订单为order_id=00001234的订单,其投诉衣服不漂亮"中找到 order_id=00001234
select REGEXP_EXTRACT('这是顾客小李订单为order_id=00001234的订单,其投诉衣服不漂亮',order_id=(\\d+),1)
(2)在字符串中过滤出数字
比如"买10送1.5"
select REGEXP_EXTRACT('买10送1.5','(\\d+)送',1) --得到10
select REGEXP_EXTRACT('买10送1.5','送(\\S+)',1) --得到1.5
比如"送买10送2.5'
SELECT REGEXP_EXTRACT('送买10送2.5','(\\d+\\.\\d+|\\d+)',1); --返回10
SELECT REGEXP_EXTRACT('送买10送2.5','(\\d+\\.\\d+|\\d+)$',1) ; --返回2.5
5.正则中引用group的值
会变着花样玩group,就会正则了
string regexp_replace(string source, string pattern, string replace_string[, bigint occurrence])
通过\1引用前面group的值
select REGEXP_REPLACE('买10送1.5;买12送2买15送5','送\\d+买','送\\1;买');
6.正则匹配日期
'(([0-9]{3}[1-9]|[0-9]{2}[1-9][0-9]{1}|[0-9]{1}[1-9][0-9]{2}|[1-9][0-9]{3})(((0[13578]|1[02])(0[1-9]|[12][0-9]|3[01]))|((0[469]|11)(0[1-9]|[12][0-9]|30))|(02(0[1-9]|[1][0-9]|2[0-8]))))|((([0-9]{2})(0[48]|[2468][048]|[13579][26])|((0[48]|[2468][048]|[3579][26])00))0229)$'
7.正则匹配数字
正则表达式匹配5,6位数字 :
\d{5,6}
\\d{5,6}