一、背景
- 之前看到过好几次sql是下面这种写法, 又看到了,纯属兴趣记录一下~
select `(colum_a|colum_b)?+.+`
from table_a
-
这个sql代表 从 表table_a 中select 出来 除了colum_a和colum_b的所有列
-
这个官方文档是有示例的
二、原理
- 拆分
(colum_a|colum_b)?+.+
(colum_a|colum_b)?+
是一段,后面.+
是第二段。- 需要特别注意的是第一段的
?+
是特殊用法,即 占有优先量词(一旦匹配某些内容,就不会 “交还”
)。量词有哪些以及什么特性可以参考下这篇简单整理的正则相关小知识的文档
- 实现过程
- 第一段在匹配到
colum_a
或者colum_b
后,第二段的.+
代表任意字符必须出现一次或多次,这样colum_a
和colum_b
就匹配不上了 - 而其他列名的由于第一段(
colum_a
|colum_b
)?+可以0匹配,第二段也满足,所以却能够匹配上。 - 这样就巧妙的实现了匹配
colum_a
和colum_b
之外的所有列名了。
- 第一段在匹配到