Создать регулярное выражение на основе переменных

У меня возникли проблемы с созданием регулярного выражения для запроса к базе данных, который я делаю. В настоящее время я использую базу данных 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 — третья часть большого ключа (также показана выше).

Итак, все сводится к тому, что я буду знать 2 части составного ключа из четырех частей, которые всегда будут в одной и той же форме, и мне нужно создать сопоставление регулярных выражений или шаблонов, чтобы узнать, когда первая и третья части ключ соответствует входным данным метода getBlah().

ИЗМЕНИТЬ

Загвоздка в Accumulo (по крайней мере, в этом случае) заключается в том, что я в основном строю регулярное выражение для запроса. Поэтому, когда вызывается метод getBlah(String k1, String k2), я еще не делал запросов к базе данных, поэтому я не буду знать весь ключ или даже то, как выглядит строка. В этом случае запрос в основном похож на оператор выбора. Таким образом, он просматривает всю таблицу и ищет @ rowid, где этот шаблон совпадает, а затем вытаскивает все совпадения. Поэтому мне нужно иметь возможность использовать этот метод для динамического сопоставления шаблона rowids, не зная их заранее.

Таким образом, все rowids всегда будут в форме xxxxxxx.xxxxxxx.xxxxxxx.xxxxxxx, а ключи, которые передаются в метод, всегда будут представлять первый и третий наборы x.


person erp    schedule 22.10.2015    source источник
comment
Отличное объяснение предыстории вашего вопроса, но о регулярном выражении ... что вы пробовали? И почему вы вообще хотите создать регулярное выражение, почему бы вам просто не разделить на '.' и взять первый и третий элемент результата? (Шаблон String.split также является регулярным выражением, поэтому для вас это будет \\.)   -  person Erwin Bolwidt    schedule 22.10.2015
comment
Привет. Спасибо за ваш ответ. Я обновил оператор, вероятно, пока вы печатали ответ, чтобы объяснить, что вы не можете сделать что-то вроде разделения. Вы не знаете всего ключа, пока не приступите к методу. Я пытаюсь создать регулярное выражение в зависимости от того, что передается. В свою очередь, запрос Accumulo, который я создаю, работает как select from table where blah = whatever. В зависимости от регулярного выражения результаты будут извлечены только в том случае, если они соответствуют шаблону. Я не хочу вытаскивать все, а затем сортировать или, что еще хуже, делать несколько запросов.   -  person erp    schedule 22.10.2015
comment
Если я могу спросить, какова цель функции getBlah? Если это для извлечения определенных часто используемых записей, то использование регулярных выражений чрезвычайно дорого, потому что вам нужно сканировать огромное количество строк. В этом случае рассмотрите возможность использования вторичного (и, возможно, третичного) индекса. Если эта функция используется редко и у вас есть доступ к кластерам, рассмотрите возможность использования пользовательского итератора, расширяющего итератор фильтра. В противном случае вам просто нужно отсканировать и отфильтровать результат.   -  person Averman    schedule 12.11.2015


Ответы (2)


как насчет этого, и, пожалуйста, поправьте меня, если я ошибаюсь

key1\..*\.key3

or

\\.([a-z0-9-])*\\." + k2 + "\\.[0-9]*

если у вас есть k2 в качестве переменной

если вы попытаетесь сопоставить этот шаблон в столбце rowId, я думаю, это должно дать вам правильную строку

person AbtPst    schedule 22.10.2015
comment
Это не работает. Я думаю, что это должно быть больше похоже на k1 + "(\\.)([a-z0-9-]*)(\\.)" + k2 - person erp; 22.10.2015
comment
ты не имеешь в виду k3 в конце? - person AbtPst; 22.10.2015
comment
кроме того, что у вас есть это - person AbtPst; 22.10.2015
comment
так что да, в основном key1, за которым следует . за которым следует любое количество любых символов, за которыми следует . затем ключ3 :) - person AbtPst; 22.10.2015
comment
Это было выигрышное решение \\.([a-z0-9-])*\\." + k2 + "\\.[0-9]* ЕСЛИ вы обновите свой ответ, я выберу его (потому что это не сработало: p) - person erp; 22.10.2015
comment
Выполнено. я думал, что k1 и k3 были вашими вкладами. в любом случае, рад, что вы смогли решить - person AbtPst; 22.10.2015

В дополнение к правильному регулярному выражению, приведенному выше, вы можете повысить производительность запроса, ограничив диапазон сканирования до key1. Таким образом, Accumulo не нужно выполнять полное сканирование таблицы.

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

см.: Документация диапазона

person Martin Grimmer    schedule 10.11.2015