我在创建正在进行的数据库查询的正则表达式时遇到了一些麻烦。我目前使用的是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 [] @\x18\x00\x00\x00\x00\x00\x00
我想要匹配的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)
时,我将不会查询数据库,因此我不会知道整个键,甚至不知道行的样子。在这种情况下,查询基本上类似于select语句。所以它会遍历整个表格并查看@ rowid
这个模式恰好匹配的位置,然后拉下所有匹配项。因此,我需要能够使用此方法动态匹配rowid
的模式,而无需事先了解它们。
因此所有rowid
将始终采用xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx
的形式,并且传递给方法的键将始终代表第一组和第三组x。
答案 0 :(得分:0)
怎么样,如果我错了,请纠正我
key1\..*\.key3
或
\\.([a-z0-9-])*\\." + k2 + "\\.[0-9]*
如果您将k2作为变量
如果您尝试在rowId列上匹配此模式,我认为这应该为您提供正确的行
答案 1 :(得分:0)
除了上面的正确正则表达式之外,您还可以将扫描范围限制为key1
,从而提高查询效果。所以Accumulo不必进行全表扫描。
Range myScanRange = Range.prefix(key1);
myScanner.setRange(myScanRange);