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

2018-01-09 16:16:34 浏览数 (1)

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

0 人点赞