基于变量创建正则表达式



我在为数据库查询创建正则表达式时遇到了一点麻烦。我目前使用的是一个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

相关内容

  • 没有找到相关文章

最新更新