Подтвердить что ты не робот

Включение комментариев в регулярные выражения 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());

EDIT: Я был бы признателен за примеры формата (? x).

EDIT: @geowa4 имеет хорошее предложение, которое позволяет избежать встроенных комментариев. Sinnce java и другие предоставили встроенные комментарии, в каких случаях они полезны? (Я думаю, что у меня есть случай, но мне было бы интересно увидеть других).

EDIT: как указано ниже @mikej, регулярное выражение не поддерживает дополнительную начальную ячейку и будет лучше:

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

но это приведет к извлечению пространства в начальном

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

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

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

Ответ 3

Я нашел следующее:

        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 явно в строку