Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 基于变量创建正则表达式_Java_Regex_Pattern Matching_Accumulo - Fatal编程技术网

Java 基于变量创建正则表达式

Java 基于变量创建正则表达式,java,regex,pattern-matching,accumulo,Java,Regex,Pattern Matching,Accumulo,我在为正在进行的数据库查询创建正则表达式时遇到了一些问题。我目前正在使用Accumulo数据库(这一点无关紧要)。在Accumulo中,一行看起来像: rowid columnfamily:columnqualifier[]值 您可以使用迭代器对四个模式中的每一个进行模式匹配。因此,我遇到的问题是试图找到一种模式来匹配rowid。整排看起来像这样 2BEB7B3-0792-4347-a63b-3e2f3c6b048d.4ce7be2a-fb2e-4694-94db-877a0ed3e68b.ed

我在为正在进行的数据库查询创建正则表达式时遇到了一些问题。我目前正在使用Accumulo数据库(这一点无关紧要)。在Accumulo中,一行看起来像:

rowid columnfamily:columnqualifier[]值

您可以使用迭代器对四个模式中的每一个进行模式匹配。因此,我遇到的问题是试图找到一种模式来匹配
rowid
。整排看起来像这样

2BEB7B3-0792-4347-a63b-3e2f3c6b048d.4ce7be2a-fb2e-4694-94db-877a0ed3e68b.edd1918d-9ddc-4597-891a-d12c8c7be602.1445442700588事务:事件[]@\x18\x00\x00\x00\x00\x00\x00

其中,我尝试匹配的
rowid
如下所示:

2BEB7B3-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(字符串k1,字符串k2)
时,我还没有查询数据库,因此我不知道整个键,甚至不知道行的外观。在本例中,查询基本上类似于select语句。因此,它将遍历整个表,查找@
rowid
,该模式恰好匹配的位置,然后下拉所有匹配项。因此,我需要能够使用此方法动态匹配
rowid
s的模式,而不必事先知道它们


因此,所有
rowid
s将始终采用
xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx
的形式,并且传递到方法中的键将始终表示第一组和第三组x。

这如何,如果我错了,请纠正我

key1\..*\.key3

如果将k2作为变量


如果您尝试在rowId列上匹配此模式,我认为这将为您提供正确的行

除了上面正确的正则表达式之外,您还可以通过将扫描范围限制为
key1
来提高查询性能。因此Accumulo不必进行全表扫描

Range myScanRange = Range.prefix(key1);
myScanner.setRange(myScanRange);

请参阅:

关于问题背景的精彩解释,但关于正则表达式。。。你试过什么?为什么首先要创建一个regexp,为什么不在“.”上拆分,并获取结果的第一个和第三个元素?(String.split模式也是一个正则表达式,所以对您来说应该是“\\”)嘿。谢谢你的回复。我更新了op,可能是在你输入回复时,解释你不能做分裂之类的事情。在使用该方法之前,您不知道整个关键点。我正试图根据传入的内容构建一个正则表达式。反过来,我正在构建的Accumulo查询的工作方式类似于从表中选择blah=which
。根据正则表达式的不同,结果只有在与模式匹配时才会下拉。我不想把所有的东西都拉下来,然后进行排序,或者更糟糕的是进行多个查询?如果是为了检索某些经常使用的记录,那么使用正则表达式的代价是巨大的,因为您必须扫描的行数太多了。在这种情况下,考虑使用二级(或许是第三级)索引。如果该函数被独立使用,并且您可以访问群集,请考虑使用自定义迭代器扩展筛选器迭代器。否则,您只需扫描并过滤结果。这不起作用。我想它应该更像是
k1+”(\\)([a-z0-9-]*)(\\)“+k2
你不是说最后是k3吗?除此之外,你还得到了它是的,基本上是键1后面跟着一个。后跟任意数量的任意字符,后跟。然后是键3:)这是获胜的解决方案。
\\([a-z0-9-])*\\.“+k2+”\.[0-9]*
如果您更新您的答案,我会选择它(因为按原样不起作用:p)
Range myScanRange = Range.prefix(key1);
myScanner.setRange(myScanRange);