2015-10-22 2 views
0

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

EDIT

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

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

+1

Великое объяснение о подоплеке вашего вопроса, но и о регулярных выражениях ... что вы пробовали? И почему вы хотите создать регулярное выражение в первую очередь, почему бы вам просто не разделить на. и взять первый и третий элемент результата? (Шаблон String.split также является регулярным выражением, поэтому для вас это будет «\\.») –

+0

Эй. Спасибо за ваш ответ. Я обновил оп, возможно, пока вы вводили ответ, чтобы объяснить, что вы не можете сделать что-то вроде раскола. Вы не знаете весь ключ, прежде чем идти в этот метод. Я пытаюсь создать регулярное выражение в зависимости от того, что передается. В свою очередь, запрос Accumulo, который я создаю, работает как «выбрать из таблицы, где blah = whatever». В зависимости от регулярного выражения результаты будут сбрасываться только в том случае, если они соответствуют шаблону. Я не хочу, чтобы все тянуть, затем сортировать его или, что еще хуже, делать несколько запросов. – erp

+0

Если я могу спросить, какова цель функции getBlah? Если для частого использования некоторых записей используется регулярное выражение, то чрезмерное дорогостоящее использование регулярных выражений, потому что простое количество строк, которое вы должны сканировать. В этом случае рассмотрите использование вторичного (и, возможно, третичного) индекса. Если эта функция редко используется, и у вас есть доступ к кластерам, подумайте об использовании пользовательского итератора фильтра, расширяющего итератор. В противном случае вам просто нужно сканировать и фильтровать результат. – Averman

ответ

0

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

key1\..*\.key3 

или

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

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

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

+0

Это не работает. Я думаю, что это должно быть больше похоже на «k1 +» (\\.) ([A-z0-9 -] *) (\\.) "+ K2' – erp

+0

Разве вы не имеете в виду k3 в конце? – AbtPst

+0

кроме этого у вас есть – AbtPst

0

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

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

см: Range documentaion

 Смежные вопросы

  • Нет связанных вопросов^_^