Написать шаблон регулярных выражений для облегчения понимания / обслуживания? - PullRequest
0 голосов
/ 07 декабря 2018

Шаблон регулярного выражения такой:

".*/.*/.*/.*/.*/.*/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*"

действительно трудно поддерживать.

Мне интересно, есть ли что-то вроде:

".*<userName>/.*<envName>/.*<serviceName>/.*<dataType>/.*<date>/.*<host>/(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*<fileName>"

, чтобы помочь легче читать / понимать регулярные выражения?

Обновлено 2018-12-07

Спасибо за помощь @Liinux, он называется free-space , и простая демонстрационная версия Java будет:

public static void main(String[] args) {
    String re = "(?x)"
            + "# (?x) is the free-spacing flag\n"
            + "#anything here between the first and last will be ignored\n"
            + "#in free-spacing mode, whitespace between regular expression tokens is ignored\n"
            + "(19|20\\d\\d)       # year (group 1)\n"
            + "[-/\\.]             # separator\n"
            + "(\\d{2})            # month (group 2)\n"
            + "[-/\\.]             # separator\n"
            + "(\\d{2})            # day (group 3)";
    Pattern pattern = Pattern.compile(re);
    Stream.of("2018-12-07", "2018.12.07", "2018/12/07").forEach(aTest -> {
        System.out.println("**************** Testing: " + aTest);
        final Matcher matcher = pattern.matcher(aTest);
        if (matcher.find()) {
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group - " + i + ": " + matcher.group(i));
            }
        }
    });
}

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Если вы используете Perl, вы можете просто включить флаг /x и поместить пробел и комментарии в регулярное выражение:

qr{
    .*  # userName
    /
    .*  # envName
    /
    .*  # serviceName
    /
    .*  # dataType
    /
    .*  # date
    /
    .*  # host
    /
    (.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*  # fileName
}x

Тем не менее, все эти .*, вероятно, должны быть [^/]* если вы это имеете в виду (последовательность символов без косой черты).

Вы также можете создать шаблон из переменных с разумными именами:

my $userName =
my $envName =
my $serviceName =
my $dataType =
my $date =
my $host = qr{[^/]*};

my $fileName = qr{(.*)-\d{2}\.\d{2}\.\d{2}.\d{4}.*};

...
qr{$userName/$envName/$serviceName/$dataType/$date/$host/$fileName}
0 голосов
/ 07 декабря 2018

Вы можете добавить комментарии в регулярном выражении, используя свободный интервал , если ваш язык поддерживает это.В режиме свободного пробела пропуски игнорируются (применяются предостережения), и вы можете добавлять комментарии, используя знак #.

Пример из учебника

# Match a 20th or 21st century date in yyyy-mm-dd format
(19|20)\d\d                # year (group 1)
[- /.]                     # separator
(0[1-9]|1[012])            # month (group 2)
[- /.]                     # separator
(0[1-9]|[12][0-9]|3[01])   # day (group 3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...