Статьи

Написание регулярного выражения Java без чтения руководства пользователя


Написание и / или поддержание регулярных выражений является частью рутинной работы каждого разработчика.
И мы обычно не можем этого вынести. Это раздражает, синтаксис не запоминается людьми, и в целом это опыт, который хочется оставить как можно быстрее, чтобы мы могли перейти к 
актуальной проблеме, с которой мы сталкиваемся. Вы задаетесь вопросом, что произойдет, если мы сделаем Покер Оценить проблему RE? Каково будет отклонение между оценкой и реальным временем, которое потребовалось? Видите ли, когда нам нужно написать новое RE, мы выполняем следующие шаги:

  1. Посетите шаблоны для быстрого ознакомления с синтаксисом.
  2. Опишите РЭ на английском языке. Это выглядит примерно так: «начинаются с 4 цифр, после которых идут пробелы, затем строка« DUR », затем снова несколько пробелов и, наконец, одна цифра»
  3. Переведите английское описание в синтаксис Java: «\ d {4} \ s + DUR \ s + \ d»
  4. Придумайте примеры. Так что здесь будет что-то вроде: «1234 DUR 9»
  5. Напишите тест, подтверждающий примеры, продумывая крайние случаи и проверяя, что RE является действительным.

Ситуация еще хуже, когда нужно изменить существующее регулярное выражение.
Здесь нам нужно перевести синтаксис RE обратно на английский, применить изменения и перевести обратно в синтаксис RE. За этим снова следуют примеры и тестирование.

Мы не одни сталкиваемся с этой проблемой.
Существует несколько решений, облегчающих процесс (например,
txt2re ). Проблемы с этими решениями:
  • Они всегда требуют выхода из IDE.
  • Обычно они не помогают понять существующее RE, а только помогают создавать новые.

Так что мы предлагаем?
Мы представляем вам 
Мастер регулярных выражений , новый подход к написанию и поддержке регулярных выражений Java. Это проект на основе Java, цель которого — помочь вам свободно писать RE, используя 
Wizard Design Pattern .

Насколько просто это может быть?
Давайте напишем RE из нашего предыдущего примера, используя новый мастер. Просто создайте объект мастера, а затем с помощью статических методов медленно создайте свой собственный RE, а затем примеры для тестирования. 
 RE_Wizard re = new RE_Wizard();
        String dur = re.start().
                a_character_described_as(a_digit).exactly(4L).then().
                a_character_described_as(a_whitespace_character).once_or_more().then().
                a_fixed_string("DUR").then().
                a_character_described_as(a_whitespace_character).then().
                a_character_described_as(a_digit).
                for_example("1234 DUR 9").for_example("4423   DUR 1").the_end();

Здесь нет необходимости в шагах A (пересчет синтаксиса), C ​​(с использованием синтаксиса) и E (написание теста).
Обратите внимание, что если указанный пример не соответствует регулярному выражению, то будет выдано исключение anExampleDoesNotMatchRegularExpression. Все, что вам нужно сделать, это описать RE на английском языке и привести несколько примеров. Самая лучшая часть приходит, когда позже вам нужно изменить его. Опять же вам не нужно иметь дело со странным синтаксисом. Вам нужно знать только английский.


Давайте возьмем другой пример.
Mkyong написал пост «
10 примеров регулярных выражений Java, которые вы должны знать ». Мы взяли один для создания регулярного выражения для времени в 24-часовом формате.
        //([01]?[0-9]|2[0-3]):[0-5][0-9]
        RE_Wizard re = new RE_Wizard();
        String timeRE = re.start().start_group().
                any_character_in("01").no_more_then(1L).then().
                any_character_in_the_range("0","9").
                or().
                a_fixed_string("2").then().
                any_character_in_the_range("0","3").then().
                close_group().
                then().
                a_fixed_string(":").then().
                any_character_in_the_range("0","5").then().
                any_character_in_the_range("0","9").then().
                for_example("06:58").
                for_example("6:45").
                for_example("23:12").
                the_end(); 

Так где же взять это?
Код мастера можно найти по 
адресу https://github.com/azarian/wizards.git . Используйте его, поделитесь им, напишите нам, и забудьте о потере времени на написание RE.
Отказ от ответственности
  • Мы не реализовали весь синтаксис регулярных выражений Java в основном из-за ограничения по времени. Если кто-то хочет внести свой вклад, он будет высоко оценен.
  • Мы не включаем инструкции по использованию компоновщика. Мы надеемся, что это прямо вперед. Если это не так, то мы упускаем суть, поэтому, пожалуйста, сообщите нам.