Включение комментариев в регулярные выражения Java

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

В качестве примера я хочу прокомментировать субкомпоненты (из patternS) в простом парсере имен:

    String testTarget = "Waldorf T. Flywheel";
    String patternS = "([A-Za-z]+)\\s+([A-Z]\\.)?\\s+([A-Za-z]+)";
    Pattern pattern = Pattern.compile(patternS, Pattern.COMMENTS);
    Assert.assertTrue(pattern.matcher(testTarget).matches());

РЕДАКТИРОВАТЬ: Я был бы благодарен за примеры формата (? X).

РЕДАКТИРОВАТЬ: @ Geowa4 есть хорошее предложение, которое избегает встроенных комментариев. Sinnce Java и другие предоставили встроенные комментарии, в каких случаях они полезны? (Я думаю, что у меня есть дело, но мне было бы интересно увидеть других).

РЕДАКТИРОВАТЬ: Как отмечено ниже @mikej, регулярное выражение не поддерживает необязательную начальную скважину и будет лучше, как:

        String patternS = "([A-Za-z]+)\\s+([A-Z]\\.\\s+)?([A-Za-z]+)";

но это в конечном итоге извлекает место в начальном

3 ответа

Решение

Посмотрите пост Мартина Фаулера на ComposedRegex, чтобы узнать больше о том, как улучшить читаемость регулярных выражений. Таким образом, он выступает за разбиение сложного регулярного выражения на более мелкие части, которым можно дать значимые имена переменных. например

String mandatoryName = "([A-Za-z]+)";
String mandatoryWhiteSpace = "\\s+";
String optionalInitial = "([A-Z]\\.)?";
String pattern = mandatoryName + mandatoryWhiteSpace + optionalInitial +
    mandatoryWhiteSpace + mandatoryName;

Почему бы тебе просто не сделать это:

String pattern2S = 
    "([A-Za-z]+)" + //    mandatory firstName
    "\\s+" +        //    mandatory whitespace
    ...;

ПРОДОЛЖЕНИЕ:

Если вы хотите сохранить комментарии с шаблоном и вам нужно прочитать их из файла свойств, используйте это:

pattern=\
#comment1\\n\
(A-z)\
#comment2\\n\
(0-9)

Я нашел следующее работало:

        String pattern2S = 
            "([A-Za-z]+)      # mandatory firstName\n" +
            "\\s+             # mandatory whitespace\n " +
            "([A-Z]\\.)?      # optional initial\n" +
            "\\s+             # whitespace\n " +
            "([A-Za-z]+)      # mandatory lastName\n"; 

Ключевым моментом было явное включение символа новой строки \n в строку

Другие вопросы по тегам