我在为数据库查询创建正则表达式时遇到了一点麻烦。我目前使用的是一个Accumulo数据库(这一点并不重要)。在Accumulo中,一行看起来像:
rowid columnfamily : columnqualifier [ ] value
,您可以使用迭代器对四个元素中的每一个进行模式匹配。所以我遇到麻烦的地方是试图想出一个模式来匹配rowid
。整行看起来像这样
2beab7b3-0792-4347-a63b-3e2f3c6b048d.4ce7be2a-fb2e-4694-94db-877a0ed3e68b.edd1918d-9ddc-4597-891a-d12c8c7be602.1445442700588 transaction:occurrences [] @x18x00x00x00x00x00x00
我试图匹配的rowid
看起来像:
2beab7b3-0792-4347-a63b-3e2f3c6b048d.4ce7be2a-fb2e-4694-94db-877a0ed3e68b.edd1918d-9ddc-4597-891a-d12c8c7be602.1445442700588
这是我使用其他3个密钥(来自3个对象)和时间戳创建的唯一密钥,它们都由.
分隔。基本上我们有这个:
2beab7b3-0792-4347-a63b-3e2f3c6b048d //key 1 for the method below
4ce7be2a-fb2e-4694-94db-877a0ed3e68b //dont care about this key
edd1918d-9ddc-4597-891a-d12c8c7be602 //key 3 for the method below
1445442700588 //dont care about the timestamp
我正在使用的方法将是这样的:
public blah getBlah(String key1, String key3){
//do regex stuff
}
其中key1
是大键的第一部分(如上所示),key3
是大键的第三部分(如上所示)。
所以这一切都归结为这样一个事实,即我将知道四部分复合键的两个部分,它们将始终以相同的形式存在,并且我需要创建一个正则表达式或模式匹配器,以找出键的第一部分和第三部分何时匹配方法getBlah()
的输入。
编辑
在Accumulo中(至少在本例中),我基本上是为查询构建正则表达式。因此,当方法getBlah(String k1, String k2)
被调用时,我还没有查询数据库,所以我不知道整个键,甚至不知道行是什么样子。在这种情况下,查询基本上类似于选择语句。因此,它将遍历整个表并查看@ rowid
模式恰好匹配的地方,然后拉下所有匹配。所以我需要能够使用这种方法来动态匹配rowid
s的模式,而不需要事先知道它们。
所以所有的rowid
总是以xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx
的形式存在,传递给方法的键总是代表第一个和第三个x集合
这个怎么样,如果我错了请纠正我
key1..*.key3
或
\.([a-z0-9-])*\." + k2 + "\.[0-9]*
如果k2是变量
如果你试着在rowId列上匹配这个模式,我认为这应该给你正确的行
除了上面的正确正则表达式之外,您还可以通过将扫描范围限制为key1
来提高查询性能。因此,Accumulo不需要进行全表扫描。
Range myScanRange = Range.prefix(key1);
myScanner.setRange(myScanRange);
参见:Range document