问题:正则表达式无法按预期运行HBase扫描过滤器。 虽然此RegEx在没有任何错误的情况下通过,但它不会仅返回已过滤的行。
背景: 我们将数据存储在HBase中作为字符串(我知道它应该在Avro中,但现在需要使用它。)
我们的HBase列DataRows如下所示,pipe用作分隔符。
NAME | 10000081 | 10000102 | 13513 | 10102026 | GENDER | ID 名称| 10000081 | 10000101 | 13513 | 10102026 |性别| ID 名称| 10000081 | 10000103 | 13513 | 10102026 |性别| ID 名称| 10000082 | 10000104 | 13515 | 10102026 |性别| ID NAME | 10000082 | 10000104 | 13516 | 10102026 | GENDER | ID
我正在为HBase扫描程序编写一个RegEx过滤器,它将扫描这些行。
我的RegEx字符串如下所示:
^NAME\\|.*\\|.*\\|.*\\|.*\\|.*\\|.*$
这是HBase QualifierFilter的输入,例如
Filter qfilter = new QualifierFilter(CompareFilter.CompareOp.EQUAL,new RegexStringComparator(regexString.toString()));
在上面的正则表达式字符串示例中(我想只过滤Name = RECKO和3rd col = 10000101)。 它返回所有行。
Regex String = ^NAME\\|.*\\|10000101\\|.*\\|.*\\|.*\\|.*$
我的正则表达式出了什么问题?任何指针/建议都非常感激。
测试程序:
public class RegEx1 {
public static void main(String[] args) {
String Str[] = {
"PC|10000081|10000102|13513|10102026|LOC|ic",
"PC|10000081|10000101|13512|10102025|LOC|zc",
"NAME|10000042|10000084|13576|10101626|GENDER|cc",
"NAME|10000042|10000084|13576|10101626|GENDER|za",
"NAME|10000042|10000084|13576|10101626|GENDER|zc",
"NAME|10000061|10000086|13581|10101630|GENDER|ic",
"NAME|10000061|10000086|13581|10101630|GENDER|za",
"NAME|10000061|10000086|13581|10101630|GENDER|zc",
"NAME|10001076|10001744|15106|10123669|GENDER|cc",
"NAME|10001076|10001744|15106|10123669|GENDER|za",
"NAME|10001076|10001744|15106|10123669|GENDER|zc",
"NAME|10000061|10000086|13581|10101630|GENDER|ic",
"NAME|10000061|10000086|13581|10101630|GENDER|za",
"NAME|10000061|10000086|13581|10101630|GENDER|zc",
"NAME|10001075|10001743|15105|10123664|GENDER|ic",
"NAME|10001075|10001743|15105|10123664|GENDER|za",
"NAME|10001075|10001743|15105|10123664|GENDER|zc",
"NAME|10001077|10001745|15239|10123673|GENDER|cc",
"NAME|10001077|10001745|15239|10123673|GENDER|za",
"NAME|10001077|10001745|15239|10123673|GENDER|zc",
"NAME|10002165|10000102|10151364|10151363|GENDER|ic",
"NAME|10002165|10003668|10151364|10151363|GENDER|za",
"NAME|10002165|10003668|10151364|10151363|GENDER|zc",
"NAME|10002167|10003670|10151368|10151367|GENDER|cc",
"NAME|10002167|10003670|10151368|10151367|GENDER|zb" };
for (String s : Str){
System.out.println(s);
System.out.println(s.matches("^NAME\\|10002167\\|.*\\|.*\\|.*\\|*$"));
}
}
}
对于上面的程序,我将所有输入值作为匹配,实际上它应该只匹配第一列=“NAME”和第二列是10002167的字符串。
更新:感谢@Aviram Segal。在校正正则表达式后,它适用于Java测试程序,但不适用于HBase扫描过滤器。
答案 0 :(得分:2)
您忘了逃避一个|
字符,因此它被视为OR
,您也可以使用[|]
代替\\|
,我个人更喜欢这种风格。
你的:^NAME\\|.*\\|10000101|.*\\|.*\\|.*\\|.*$
修正:^NAME\\|.*\\|10000101\\|.*\\|.*\\|.*\\|.*$
你的:System.out.println(s.matches("^NAME\\|10002167|.*\\|.*\\|.*\\|*$"));
修正:System.out.println(s.matches("^NAME\\|10002167\\|.*\\|.*\\|.*\\|*$"));
答案 1 :(得分:0)
.
代表任何角色因此问题。尝试使用\w
替换.
。