HBase中正则过滤表达式与JAVA正则表达式不一致问题的分析和解决

HBase提供了丰富的查询过滤功能。


比如说它提供了RegexStringComparator这样的函数,可以实现按照正则表达式进行过滤。它可以有效地弥补向前缀查询这样的机制,从而可以使hbase也支持了类似于like查询之类的功能。


然而在实践过程中,很多人都会遇到一个问题,对于里面的正则表达式没有过于详细的介绍,一直以为是直接从JAVA等一些标准的正则表达式演化过来。直接拿过来用就可以。


但是,这只是美好的猜测而已。


如stackoverflow上的这篇问题一样。http://stackoverflow.com/questions/13997794/java-regular-expression-for-hbase-scan-filter-not-working。


如现在想对一串数字字符进行查询,如201609282222633_1333222222_22222,


如果直接照用JAVA的正则表达式如“^20160928+\\d{6}_133\\d{4,}_\\d{0,}$",这样在JAVA中肯定可以快速编译通过,然而在hbase查询中却通不过。


经过一番认真查看,才发现HBASE中的正则表达式略微有些区别。


最重要还是其源码中自带的一个小例子。如

* ValueFilter vf = new ValueFilter(CompareOp.EQUAL,
  * new RegexStringComparator(
  * // v4 IP address
  * "(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3,3}" +
  * "(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(\\/[0-9]+)?" +
  * "|" +
  * // v6 IP address
  * "((([\\dA-Fa-f]{1,4}:){7}[\\dA-Fa-f]{1,4})(:([\\d]{1,3}.)" +
  * "{3}[\\d]{1,3})?)(\\/[0-9]+)?"));
  * </pre>
  */

这个类的源码中对于IP地址的查询中,发现其\\d这样的字符的设置加了一个方括号,加上,果然顺利通过。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值