Регулярные выражения java, создание своего pattern

303
15 февраля 2017, 21:57

Здравствуйте! По учебе, выдали задание, в котором нельзя использовать встроенный в java метод pattern и требуется создать свой обработчик регулярных выражений. Задание звучит так: Парсер, использующий простые регулярные выражения, вводимые с клавиатуры, содержащие управляющие конструкции . – любой символ, * - 0 и более символов, + - 1 и более символов (вводится регулярное выражение и строка, результатом является позиция, с которой это выражение встречается в тексте)

Matcher для поиска в тексте использовать можно. Буду рад ссылкам по теме создания своего обработчика регулярных выражений.

Answer 1

Весьма известная реализация подобного поиска. Для вашей задачи можно даже убрать ряд проверок. Если нужен +, то замените его просто на предыдущий символ и звёздочку. a+ -> aa* Код на С++ но легко переносится на Java (используется только индексация в строке).

// Формат регулярного выражения.
// c     Соответсвует любой букве "с"
// .(точка)  Соответсвует любому одному символу
// ^     Соответсвует началу входящей строки
// $     Соответствует концу входящей строки
// *     Соответствует появлению предыдущего символа от нуля до
//       нескольких раз
int matchhere(char *regexp, char *text);
int matchstar(int c, char *regexp, char *text);
// match: поиск соответствий регулярному выражению по всему тексту
int match(char *regexp, char *text)
{
  char * save = text;
  if (regexp[0] == '^')
    return matchhere(regexp+1, text);
  do { /* нужно посмотреть даже пустую строку */
   if (matchhere(regexp, text))
     return text - save;
  } while (*text++ != '\0');
  return -1;
}
// matchhere: поиск соответствий регулярному выражению в начале текста
int matchhere(char *regexp, char *text)
{
   if (regexp[0] == '\0')
     return 1;
   if (regexp[1] == '*')
     return matchstar(regexp[0], regexp+2, text);
   if (regexp[0] == '$' && regexp[1] == '\0')
     return *text == '\0';
   if (*text!='\0' && (regexp[0]=='.' || regexp[0]==*text))
     return matchhere(regexp+1, text+1);
   return 0;
}
// matchstar: поиск регулярного выражения вида с* с начала текста
int matchstar(int c, char *regexp, char *text)
{
  do {   /* символ * соответствует нулю или
            большему количеству появлений */
    if (matchhere(regexp, text))
      return 1;
  } while (*text != '\0' && (*text++ == c || c == '.'));
  return 0;
}

Код не мой, поэтому ответ общий.

READ ALSO
Поиск по webview

Поиск по webview

Как реализовать поиск по страницеЯ не могу понять как построить следующее: если на странице найдено слово "слово" то выполнить "действие"

391
java - Проверка на последнюю цифру 9

java - Проверка на последнюю цифру 9

ЗдравствуйтеВ процессе работы пришлось проверять, является ли последняя цифра числа девяткой

360
Узнать громкость мультимедиа android

Узнать громкость мультимедиа android

Например в whatsApp, когда слушаешь голосовые сообщения и громкость мультимедиа маленькая - выводится сообщение "Увеличьте громкость"

284
Не работает nextLine() у Scanner`а

Не работает nextLine() у Scanner`а

Я должен ввести значение для owner и number строки, но в консоль выводит:

350