使用正则完成大写小转换
前言
前两天遇到一个场景,事情是这样的,做一个项目的迁移,本来一切是很美好的,服务都打包好了,包括数据库相关的脚本都准备好了,一切看起来很顺利,可是在启动服务的时候提示 “table xx.xx does’not exist”。
这就有点懵了,sql脚本已经执行完成了(我看着执行过程的),为什么还提示没有表?随即联系运维看了下数据库,核对了下表确实存在,仔细一看又不对,错误信息提示的表不存在表名是小写的,而运维给到的表名是大写的!
这就有点尴尬了,不知道sql脚本是谁准备的(肯定是用工具导出的),表名变为了大写(我们使用的是mysql数据库,一般习惯是 mysql 数据库表名,字段名小写,oracle 则通常采用大写),然后查阅了一下发现 mysql 的 lower_case_table_names 配置决定 mysql 对表名大小写是否敏感。
通过
SHOW VARIABLES LIKE "%lower%";
发现我们的数据库该值是 0,刚好是区分大小写的!
此时最方便的解决办法莫过于是改变这个配置,然后重启 mysql 服务。但是,由于这个数据库不知我们这个服务在使用,因此这个方案就不用考虑了,剩下的那就只能是表脚本中的表名统一改为大写。
打开 sql 脚本一看,将近 400 个表,一个一个改,这工作量…
于是想到最近很多地方使用正则的场景就想通过正则能不能完成这个事情,询问度娘很快就有了解决方案,通过正则可以轻松应付这个场景。
正则提供的大小写转换说明
正则提供了将字符转为大小写的功能:
\U 将字符转为大写(U应该就是UpperCase的首字母吧)
\L 将字符转为小写(L应该就是LowerCase的首字母吧)
\E 停止转换
案例
先拿几个案例练练手。
转大写:
today is a nice day.
- 将上面的语句的首字母转为大写
# 查找表达式
^(.)
# 替换表达式
\U$1
结果:Today is a nice day.
- 将上面语句的每个单词的首字母转为大写
# 查找表达式
\b([^\s])([a-z]*)\b
# 替换表达式
\U$1\E$2
结果:Today Is A Nice Day.
转小写:
TODAY IS A NICE DAY.
- 将上面语句每个字母都转为小写
# 查找表达式
\b([^\s.]+)\b
# 替换表达式
\L$1
结果:today is a nice day.
- 将上面语句每个单词的非首字母转为小写
# 查找表达式
\b([^\s.])([^\s.]*)\b
# 替换表达式
$1\L$2\E
结果:Today Is A Nice Day.
实际运用
有了上面的例子,我们的场景就很好处理了,直接写出正则以及替换表达式
(?i)(TABLE|INSERT\s+INTO|UPDATE|DELETE\s+FROM)(\s+)\b([A-Z_-]+)\b
查找所有的 建表、更新表结构、插入数据、删除语句中的表名部分
表名转为大写:
$1$2\U$3\E
表名转为小写:
$1$2\L$3\E
editplus、notepad++、idea 等工具都支持使用正则替换。
好了,只需要这样一个正则,这个场景就能轻松应付。感谢大家的阅读。