最近的项目需要切换oracle数据库为mysql,遇见一个正则表达式需要进行修改,在此记录下过程及心得。
由于项目隐私,下面是截取代码片段:
select *
from dual
where regexp_like(target_column,'(^[+-]?\d{0,}\.?\d{0,}$)')
首先分析oracle正则表达式的含义:
- ^:匹配字符串的开始;
- [+ -]:表示可以匹配正号和负号;
- ?:匹配一次或零次出现,在此指前面的正号或负号可以出现零次或一次;
- \d:匹配一个数字字符;
- {0,}:至少匹配0次,在此指前面的数字可以出现零次以上;
- \.:其中\为转义字符,表示匹配字符".",在此匹配小数点;
- $:匹配字符串的结尾。
所以以上正则表达式表示匹配一个数字。
转换成mysql需要替换?为{0,1},\d替换为[0-9],.替换为\.(mysql转义字符为\)。
select target_column regexp '(^[+-]{0,1}[0,9]{0,}\\.{0,1}[0,9]{0,}$)'
-- 匹配时返回1,否则返回null
mysql执行结果:
1、带有正号的数字
2、带有负号的数字
3、不是数字