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

63
8

Я пытаюсь создать regEx для проверки пути файла и каталога. Я реализовал это, но не выполнил 1 условия, что он не должен допускать одновременное слияние коллажей. Кроме того, никакие другие специальные символы не допускаются

var x = /^(\\|\/){1}([a-zA-Z0-9\s\-_\@\-\^!#$%&]*?(\\|\/)?)+(\.[a-z\/\/]+)?$/i
    тест 1 ->/(должен пройти) тест 2 ->/asdf (должен пройти) test 3 ->/asdf/scd.csv (должен пройти) test 4 ->//asdf (должен завершиться с ошибкой) тест 5 ->/asd/ads/c.csv/(должен пройти) test 6 → asd/asfd/a (должен завершиться с ошибкой)

Можете предложить, как это решить?

спросил(а) 2020-03-25T19:22:56+03:00 1 неделя, 4 дня назад
1
Решение
80

Путь //asdf действителен для LINUX, UNIX, iOS и Android, поэтому ваш код уже работает. Однако, если по какой-то причине важно признать недействительным этот определенный набор допустимых путей, просто замените знак плюса вместо звездочки после группы символов [az...]. Это приведет к недействительности нескольких разделителей путей без промежуточных символов.

Вероятно, полезно комментировать более крупные проблемы с помощью подхода и деталей регулярного выражения.

1) Вы можете использовать [\/] вместо (\ |/), однако обе они будут допускать ложные срабатывания при каждой комбинации операционной системы и файловой системы. (Те, которые требуют косой черты, должны исключать обратную косую черту как разделитель и наоборот).

2) Диапазон символов [a-zA-Z0-9\s -_\@-\^! # $% &] В вопросе не является допустимым диапазоном символов для элементов пути каталога для любой известной комбинации операционной системы и файла система. Например, для большинства имен в именах каталогов действителен.

3) Допустимые диапазоны символов не переносимы. (Самый надежный способ проверки проверки пути - коснуться имени файла в фактической файловой системе, то есть фактически создать экземпляр пустого файла и зафиксировать любые признаки отказа от создания экземпляра.)

4) Вы не хотите или не нуждаетесь в вопросительном знаке после своей звездочки или после второй (\ |/) группы. Они не создают ошибку, но они тратят либо компиляцию, либо время выполнения, и они запутывают вашу цель регулярного выражения.

5) Вам также необходимо повторить диапазон символов непосредственно перед расширением или изменить порядок, как в примере ниже.

6) Вам не нужно добавлять диапазон AZ в диапазон az, если вы используете \i в качестве флага в конце регулярного выражения.

7) Из списка желаемых результатов видно, что относительные пути должны быть отфильтрованы, но нет явного упоминания об этом, как правило, для решения.

С нерешительностью этот код предоставляется, чтобы продемонстрировать некоторые из вышеупомянутых улучшений.

// This code is not production worthy
// for reasons (1) through (3) given
// above and is provided only for the
// purpose of clarifying points made.

var re = /^([\\/][a-z0-9\s\-_\@\-\^!#$%&]*)+(\.[a-z][a-z0-9]+)?$/i

console.log(
[
'/',
'/asdf',
'/asdf/scd.csv',
'//asdf',
'/asd/ads/c.csv/',
'asd/asfd/a'
].map(RegExp.prototype.test, re))

ответил(а) 2020-03-25T19:38:39.263806+03:00 1 неделя, 4 дня назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема