Проблема с вашим 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-]+)+$
Поддерживает:
- корневой каталог
/
- специальная форма корневого каталога
//
- любой некорневой каталог, имя которого состоит из букв, цифр, тире или подчеркивания (например,
/abc/123/_abc-123
)
Смотри также