Как я могу создать регулярное выражение для строки, такой как это:
<SERVER> <SERVERKEY> <COMMAND> <FOLDERPATH> <RETENTION> <TRANSFERMODE> <OUTPUTPATH> <LOGTO> <OPTIONAL-MAXSIZE> <OPTIONAL-OFFSET>
Большинство из этих полей являются простыми словами, но некоторые из них могут быть путями, такими как FOLDERPATH, OUTPUTPATH, эти пути также могут быть путями с добавленным именем файла и подстановочным знаком.
Удержание - это число, а режим передачи может быть как «bin», так и «ascii». Проблема в том, что LOGTO может представлять собой путь с добавленным к нему именем файла журнала или может быть NO, что означает отсутствие файла журнала.
Основная проблема - необязательные аргументы, они оба являются числами, и OFFSET не может существовать без MAXSIZE, но MAXSIZE может существовать без смещения.
Вот несколько примеров:
loveserver love copy /muffin* 20 bin C:\Puppies\ NO 256 300
loveserver love copy /muffin* 20 bin C:\Puppies\ NO 256
loveserver love copy /hats* 300 ascii C:\Puppies\no\ C:\log\love.log 256
Теперь главная проблема в том, что пути могут содержать пробелы, поэтому, если я использую. чтобы соответствовать всему, регулярное выражение в конечном итоге прерывается при разборе необязательных аргументов, где назначение LOG заканчивается присоединением к выходному пути.
Кроме того, если я в конечном итоге использовать. и начнем удалять его части, регулярное выражение начнет размещать вещи там, где не должно.
Вот мое регулярное выражение:
^(\s+)?(?P<SRCHOST>.+)(\s+)(?P<SRCKEY>.+)(\s+)(?P<COMMAND>COPY)(\s+)(?P<SRCDIR>.+)(\s+)(?P<RETENTION>\d+)(\s+)(?P<TRANSFER_MODE>BIN|ASC|BINARY|ASCII)(\s+)(?P<DSTDIR>.+)(\s+)(?P<LOGFILE>.+)(\s+)?(?P<SIZE>\d+)?(\s+)?(?P<OFFSET>\d+)?$