2013-07-21 2 views
3

У меня есть строка, которая инкрементально построена. В то время как строящаяся строка, она согласована в целом регулярным выражением, и когда совпадение найдено, выполняется определенная задача.Частичное совпадение регулярного выражения

Мое требование: если в середине процесса построения строки обнаружено, что нет точного соответствия, то строка должна быть сброшена, и процесс сборки должен быть перезапущен.

Например, если регулярное выражение "mada12gaskar" и когда символ "3" добавляется к существующей строке "mada1" строка должна быть очищена и процесс сборки должен начать снова, как "mada13" никогда не будет совпадать с "mada12gaskar". Возможно ли это с помощью Java regex API?

+0

Предоставлять пример кода, который вы пытаетесь написать, чтобы разъяснить требования. Регулярное выражение представляет собой регулярное выражение, поэтому сопоставление должно быть возможным, но вам понадобится другая логика, чтобы «очистить строку». – eebbesen

+2

Почему downvotes? Это довольно хороший вопрос для меня. –

+0

Im довольно не эксперт, но почему бы вам просто не сохранить последнюю строку соответствия (например, 'mada1') в отдельной переменной, которая будет перезаписана следующей совпадающей строкой? Если данный String ('mada13') не соответствует, перезапишите его последней совпадающей строкой, сохраненной отдельно. – nozzleman

ответ

6

Я думаю, что нашел возможное решение вашей проблемы.

Посмотрите на Matcher#hitEnd() методе:

Возвращает истину, если конец ввода был сбит с помощью поисковой системы в последней операции матча в исполнении этого согласовань.

Когда этот метод возвращает true, тогда возможно, что больше ввода изменило бы результат последнего поиска.

Теперь просто соответствует регулярному выражению против вашего пока еще не полностью построенной строки с использованием Matcher (которую можно получить с помощью Pattern например) и посмотреть на результаты:

  • , если оно соответствует, то есть ваш победитель
  • , если он не соответствует, посмотрите на hitEnd():
    • если это true, строить больше строки и попробуйте еще раз
    • , если это false, текущая строка не может быть сопоставлен, вы можете оставить его и начать
+2

Шляпы выключены, мой ответ удален. –

+0

Просто одно предостережение: «если это« ложь », текущая строка никогда не может быть сопоставлена, вы можете отказаться от нее и начать сначала» --- на самом деле вы должны * вернуться назад и, возможно, найти другую строку с тем же префиксом. –

+0

@MarkoTopolnik Я был также удивлен, когда обнаружил метод. Тем не менее, в классе «Матчи» есть несколько полезных свойств, я не знаю, что делает половина других методов. О возврате - да, конечно. –

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