Рассуждение:
Я провел небольшое исследование методом проб и ошибок. Выяснилось, что все значения, доступные на клавиатуре, могут быть файлом или каталогом, кроме '/' в * nux machine.
Я использовал команду touch, чтобы создать файл для следующих символов, и он создал файл.
(значения, разделенные запятыми ниже)
'!', '@', '#', '$', "'",'% ',' ^ ',' & ',' * ',' (',') ',' ',' "' , '\', '-', ',', '[', ']', '{', '}', '`', '~', '>', '<', '=', ' + ','; ',': ',' | '</p>
Не удалось, только когда я попытался создать '/' (потому что это корневой каталог) и контейнер имени файла /
, потому что это разделитель файлов.
И это изменило время изменения текущего каталога .
, когда я сделал touch .
. Однако файл file.log возможен.
И, конечно, a-z
, A-Z
, 0-9
, -
(hypen), _
(подчеркивание) должны работать.
Результат
Итак, по приведенным выше рассуждениям мы знаем, что имя файла или имя каталога может содержать что угодно, кроме /
прямой слеш. Таким образом, наше регулярное выражение будет получено из того, что не будет присутствовать в имени файла / имени каталога.
/(?:(?P<dir>(?:[/]?)(?:[^\/]+/)+)(?P<filename>[^/]+))/
Шаг за шагом процесс создания регулярного выражения
Шаблон Объяснение
Шаг 1: начать с сопоставления root
directory
Каталог может начинаться с /
, когда он является абсолютным путем, и именем каталога, когда он является относительным. Следовательно, ищите /
с нулем или одним вхождением.
/(?P<filepath>(?P<root>[/]?)(?P<rest_of_the_path>.+))/
![enter image description here](https://i.stack.imgur.com/1fhbA.png)
Шаг 2: Попробуйте найти первый каталог.
Затем каталог и его дочерний элемент всегда отделяются /
. И имя каталога может быть любым, кроме /
. Давайте сначала сопоставим / var /.
/(?P<filepath>(?P<first_directory>(?P<root>[/]?)[^\/]+/)(?P<rest_of_the_path>.+))/
![enter image description here](https://i.stack.imgur.com/5OzQh.png)
Шаг 3: Получить полный путь к файлу каталога
Далее, давайте сопоставим все каталоги
/(?P<filepath>(?P<dir>(?P<root>[/]?)(?P<single_dir>[^\/]+/)+)(?P<rest_of_the_path>.+))/
![enter image description here](https://i.stack.imgur.com/IlxjF.png)
Здесь single_dir равен yz/
, потому что сначала он соответствовал var/
, затем он обнаружил следующее вхождение того же шаблона, то есть log/
, затем он обнаружил следующее вхождение того же шаблона yz/
. Итак, он показал последнее появление паттерна.
Шаг 4: сопоставить имя файла и очистить
Теперь мы знаем, что никогда не будем использовать такие группы, как single_dir, filepath, root. Поэтому давайте очистим это.
Давайте сохраним их как группы, но не собираем их.
И rest_of_the_path - это просто имя файла! Итак, переименуйте его. И файл не будет иметь /
в названии, поэтому лучше оставить [^/]
/(?:(?P<dir>(?:[/]?)(?:[^\/]+/)+)(?P<filename>[^/]+))/
Это подводит нас к конечному результату. Конечно, есть несколько других способов сделать это. Я просто упоминаю один из способов здесь.
![enter image description here](https://i.stack.imgur.com/Yx3BI.png)
Правила Regex, использованные выше, перечислены здесь
^
означает, что строка начинается с
(?P<dir>pattern)
означает захват группы по имени группы. У нас есть две группы с именем группы dir
и file
(?:pattern)
означает, что не следует рассматривать эту группу или группу без захвата.
?
означает совпадение ноль или единицу.
+
означает совпадение с одним или несколькими
[^\/]
означает, что соответствует любому символу, кроме косой черты (/
)
[/]?
означает, что если это абсолютный путь, то он может начинаться с / в противном случае он не будет. Итак, сопоставьте ноль или одно вхождение /
.
[^\/]+/
означает один или несколько символов, которые не являются косой чертой (/
), за которой следует косая черта (/
). Это будет соответствовать var/
или xyz/
. Один каталог за раз.