在hive/spark sql可以支持对列名进行正则匹配,其中给出这样一个例子:
|
|
这个查询会查找除了ds和hr之外的所有列。这个正则实在是太过少见,查阅了很多资料才理解了。
首先要正确拆分(ds|hr)?+.+,(ds|hr)?+是一段,后面.+是第二段。这里面难点在于(ds|hr)?+的意义,子匹配(也就是括号)后面跟了两个量词?+,这是特殊用法,按照一般的量词意义是无法理解的,这个用法就是占有优先量词。正则的量词包括忽略优先、匹配优先、占有优先,占有优先是最大匹配后不“交还”,这点和匹配优先相反。这个例子的正则表达式,第一段在匹配到ds或者hr后,第二段的.+代表任意字符必须出现一次或多次,这样ds和hr就匹配不上了,而其他列名的由于第一段(ds|hr)?+可以0匹配,第二段也满足,所以却能够匹配上。这样就巧妙的实现了——匹配ds和hr之外的所有列名了。
支持占有优先的正则表达式的语言并不多,java算一个。你Get到了吗?
本文探讨了Hive和SparkSQL中不常见的正则表达式用法,例如 `(ds|hr)?+.+`,用于选择除ds和hr列外的所有列。这个正则表达式的难点在于其占有优先量词的运用,使得第一段可以0匹配,从而实现所需功能。解释了占有优先量词的工作原理,并指出Java等少数语言支持这种特性。通过理解这个正则,可以更深入地掌握SQL查询的灵活性。
1173

被折叠的 条评论
为什么被折叠?



