首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HBase中正则过滤表达式与JAVA正则表达式不一致问题的分析和解决

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

作者头像
sparkexpert
发布2018-01-09 16:16:34
1.2K0
发布2018-01-09 16:16:34
举报

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这样的字符的设置加了一个方括号,加上,果然顺利通过。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年09月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档