在hive/spark sql可以支持对列名进行正则匹配,其中给出这样一个例子:
|
这个查询会查找除了ds和hr之外的所有列。这个正则实在是太过少见,查阅了很多资料才理解了。
首先要正确拆分(ds|hr)?+.+,(ds|hr)?+是一段,后面.+是第二段。这里面难点在于(ds|hr)?+的意义,子匹配(也就是括号)后面跟了两个量词?+,这是特殊用法,按照一般的量词意义是无法理解的,这个用法就是占有优先量词。正则的量词包括忽略优先、匹配优先、占有优先,占有优先是最大匹配后不“交还”,这点和匹配优先相反。这个例子的正则表达式,第一段在匹配到ds或者hr后,第二段的.+代表任意字符必须出现一次或多次,这样ds和hr就匹配不上了,而其他列名的由于第一段(ds|hr)?+可以0匹配,第二段也满足,所以却能够匹配上。这样就巧妙的实现了——匹配ds和hr之外的所有列名了。
支持占有优先的正则表达式的语言并不多,java算一个。你Get到了吗?