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

70
9

Я пытаюсь создать 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 5 месяцев, 3 недели назад
1
Решение
89

Путь //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 5 месяцев, 3 недели назад
40

Попробуйте использовать /^(\/|([\\/][\w\s@^!#$%&-]+)+(\.[az]+[\\/]?)?)$/i вместо этого, который заставляет по крайней мере одного символа соответствовать каждой косой чертой:

var regex = /^(\/|([\\/][\w\s@^!#$%&-]+)+(\.[a-z]+[\\/]?)?)$/i

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

ответил(а) 2020-03-25T19:22:56+03:00 5 месяцев, 3 недели назад
40

((\/[\w\s\.@^!#$%&-]+)+\/?)|\/[\w\.\s@^!#$%&-]*

Это было протестировано в соответствии с вашим примером ввода,
НО на np++ (то есть perl-regex flavor), потому что у меня нет опыта работы с javascript.
Поэтому здесь то же самое в ароматно-прочной прозе.

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

Примечание1: Я добавил явное "." для разрешенных символов.
Примечание2: Я предполагаю, что ваш "\/" означает "явный слэш, а не обратная косая черта".

ответил(а) 2020-03-25T19:22:56+03:00 5 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

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