理解`(ds|hr)?+.+`

在hive/spark sql可以支持对列名进行正则匹配,其中给出这样一个例子

SELECT `(ds|hr)?+.+` FROM sales

这个查询会查找除了ds和hr之外的所有列。这个正则实在是太过少见,查阅了很多资料才理解了。

首先要正确拆分(ds|hr)?+.+,(ds|hr)?+是一段,后面.+是第二段。这里面难点在于(ds|hr)?+的意义,子匹配(也就是括号)后面跟了两个量词?+,这是特殊用法,按照一般的量词意义是无法理解的,这个用法就是占有优先量词。正则的量词包括忽略优先、匹配优先、占有优先,占有优先是最大匹配后不“交还”,这点和匹配优先相反。这个例子的正则表达式,第一段在匹配到ds或者hr后,第二段的.+代表任意字符必须出现一次或多次,这样ds和hr就匹配不上了,而其他列名的由于第一段(ds|hr)?+可以0匹配,第二段也满足,所以却能够匹配上。这样就巧妙的实现了——匹配ds和hr之外的所有列名了。

支持占有优先的正则表达式的语言并不多,java算一个。你Get到了吗?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值