Java инструмент для сопоставления нескольких регулярных выражений с приоритетами для нескольких строк - PullRequest
1 голос
/ 19 августа 2011

У меня есть неограниченная последовательность строк и многочисленные регулярные выражения, упорядоченные по приоритетам. Для каждой строки в последовательности я должен найти первое соответствующее регулярное выражение и соответствующую подстроку. Строки не очень длинные (<1 КБ), а количество регулярных выражений может варьироваться от сотен до тысяч. </p>

Я ищу инструмент Java, который бы эффективно справлялся с этой задачей. Я думаю, что техника должна строить DFA впереди.

Моя текущая опция - JFLEX. Проблема, которую я не могу обойти в JFLEX, состоит в том, что у ее правил нет приоритетов, и JFLEX ищет правило, соответствующее самой длинной части текста.

Мой вопрос: можно ли решить мою проблему с помощью JFLEX? Если нет, можете ли вы предложить другой Java-инструмент / технику, которая подойдет?

1 Ответ

3 голосов
/ 02 октября 2011

Вы можете использовать регулярные выражения Java.Скомпилируйте альтернативы в строку RE, где каждая альтернатива будет заключена в '(' и ') +?'и разделены знаком '|', с RE с наивысшим приоритетом.Первая конструкция делает под-RE жадными, чтобы они не возвращались и «|»альтернативы оцениваются слева направо, поэтому в первую очередь пробуются RE с наивысшим приоритетом.

Например, с учетом строки "zeroonetwothreefour"

'(one)+?|(onetwo)+?' will match 'one'
'(onetwo)+?|(one)+?' will match 'onetwo'
'(twothree)+?|(onetwothree)+?' will match 'twothree'

Обратите внимание, что в последнем примере, 'twothree' соответствует, даже если это происходит позже в целевой строке , а короче, чем 'onetwothree'.

...