一.需求
今天在论坛上看到有人提了一个正则相关的问题,刚好有时间,就给他提供了一个解决方案。
需求如下:
字符串:'我爱(xxx)中华(qq)人民(aac啊)共和国'
想达到的效果,凡是()中的内容都不需要了,包括()本身,以上字符串希望返回结果:我爱中华人民共和国。
二.解决方案
2.1 Oracle解决方案
首先想到的是regexp_replace进行替换,题目意思已经很明白,是要删除()及()里面的内容。
代码:
with tmp1 as
(select '我爱(xxx)中华(qq)人民(aac啊)共和国' str from dual)
select regexp_replace(str,'\(.*?\)','') str_new
from tmp1
测试记录:
SQL> with tmp1 as
2 (select '我爱(xxx)中华(qq)人民(aac啊)共和国' str from dual)
3 select regexp_replace(str,'\(.*?\)','') str_new
4 from tmp1
5 /
STR_NEW
------------------
我爱中华人民共和国
SQL>
2.2 MySQL解决方案
我把Oracle的解决方案贴到mysql里面执行,结果字符串没有任何变化。
代码:
with tmp1 as
(select '我爱(xxx)中华(qq)人民(aac啊)共和国' str from dual)
select regexp_replace(str,'\(.*?\)','') str_new
from tmp1
测试记录:
mysql> with tmp1 as
-> (select '我爱(xxx)中华(qq)人民(aac啊)共和国' str from dual)
-> select regexp_replace(str,'\(.*?\)','') str_new
-> from tmp1;
+----------------------------------------------+
| str_new |
+----------------------------------------------+
| 我爱(xxx)中华(qq)人民(aac啊)共和国 |
+----------------------------------------------+
1 row in set (0.00 sec)
mysql>
然后翻阅了下正则表达式的文档:
[[:punct:]] 任何标点符号。
于是用这个试试,最终问题得到解决。
代码:
select regexp_replace(str,'[[:punct:]].*?[[:punct:]]','') str_new
from (select '我爱(xxx)中华(qq)人民(aac啊)共和国' str from dual) tmp1
测试记录:
mysql> select regexp_replace(str,'[[:punct:]].*?[[:punct:]]','') str_new
-> from (select '我爱(xxx)中华(qq)人民(aac啊)共和国' str from dual) tmp1;
+-----------------------------+
| str_new |
+-----------------------------+
| 我爱中华人民共和国 |
+-----------------------------+
1 row in set (0.00 sec)
特别注意:
[[:punct:]] 任何标点符号,所以即便不是(),是其它标点符号,也是会被清空。
代码:
select regexp_replace(str,'[[:punct:]].*?[[:punct:]]','') str_new
from (select '我爱(xxx?中华,qq)人民!aac啊)共和国' str from dual) tmp1
测试记录:
mysql> select regexp_replace(str,'[[:punct:]].*?[[:punct:]]','') str_new
-> from (select '我爱(xxx?中华,qq)人民!aac啊)共和国' str from dual) tmp1;
+-----------------------------+
| str_new |
+-----------------------------+
| 我爱中华人民共和国 |
+-----------------------------+
1 row in set (0.00 sec)
网友评论