Шаблон регулярного выражения для проверки пути к папке Linux - PullRequest
0 голосов
/ 08 марта 2019

Использование JAVA.Я пытаюсь найти более элегантный способ для проверки пути к папке Linux (не включая имя файла).

На данный момент у меня есть следующее: "^\\/$|^((\\/([a-zA-Z0-9_-]+))+)$"

Пути к папкам должны включать только следующие символы: буквы , цифры , тире или подчеркивание .

Контрольные примеры

Действительный / совпадает:

  • /
  • /abc
  • /abc/abc/abc/abc

Invalid/ не совпадает:

  • ноль или пустая строка
  • /abc/
  • /abc/abc/abc/abc/

Ответы [ 3 ]

1 голос
/ 08 марта 2019

Проблема с вашим RegEx

Ваш предоставленный RegEx работает над тест-кейсами.

Вы можете даже уменьшить его , удалив обратную косую черту \\ и внешнюю пару скобок. Начало ^ и окончание $ нужны только один раз (вокруг двух альтернатив).

Возможное решение с использованием регулярного выражения

Вы можете проверить RegEx на RegexPlanet.com (нажмите на кнопку Java для тестов)

^/|(/[a-zA-Z0-9_-]+)+$

или эквивалент (см. Демонстрацию на RegexPlanet )

^/|(/[\w-]+)+$

Разъяснения: \w соответствует слово-символу (аналогично [a-zA-Z0-9_], не соответствует тире ).

Реализация в коде Java:

public boolean isValidLinuxDirectory(String path) {
    Pattern linuxDirectoryPattern = Pattern.compile("^/|(/[a-zA-Z0-9_-]+)+$");
     return path != null && !path.trim().isEmpty() && linuxDirectoryPattern.matcher( path ).matches();
}

Альтернативное решение с использованием File

Обратите внимание на документы на isDirectory () :

Возвращает: true тогда и только тогда, когда файл, обозначенный этим абстрактным путем , существует и является каталогом; false иначе

Таким образом, он может проверять ваши требования (действительная папка Linux) только при запуске на машине с Linux и если папка / каталог существует.

public boolean isValidExistingDirectory(String path) {
     if (path == null || path.trim().isEmpty()) return false;
     File file = new File( path );
     return file.isDirectory();
}

Расширенное решение

Как указано в комментарии, специальная форма корня // также должна быть действительной. Тогда используйте этот RegEx:

^/|//|(/[\w-]+)+$

Поддерживает:

  1. корневой каталог /
  2. специальная форма корневого каталога //
  3. любой некорневой каталог, имя которого состоит из букв, цифр, тире или подчеркивания (например, /abc/123/_abc-123)

Смотри также

0 голосов
/ 08 марта 2019

Чтобы охватить все случаи, включая корневой каталог, вам потребуется следующее:

^\/$|(\/[a-zA-Z_0-9-]+)+$

См. Regex Demo с использованием глобальных и многострочных модификаторов.

0 голосов
/ 08 марта 2019

Вот, пожалуйста. \/[a-zA-Z0-9_\/-]*[^\/]$

EDIT

Первый символ соответствует косой черте /. Следующая группа символов соответствует символам a-z, A-Z, 0-9, подчеркиваниям, косым чертам и черточкам (все допустимые символы каталогов и имен файлов). Следующая звездочка заставляет шаблон соответствовать этой группе символов 0 или более раз (так что любая комбинация этих символов). Последняя группа символов имеет отрицание ^, означающее, что она соответствует чему-либо, КРОМЕ того, что находится в группе символов, и является последней косой чертой, которую мы не хотим сопоставлять. Наконец $ для окончания строки.

...