На самом деле это регулярное выражение проверяет три вещи.
Здесь вы можете проверить любое регулярное выражение: https://regex101.com/
Это сведет на нет все вхождения зарезервированного файла имена в любой позиции текста:
(?:PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d)
, но для соответствия точному имени вам нужны ^
и &
, которые указывают начало и конец текста, поэтому это будет работать для второй группы:
# 1
^(?:PRN|AUX|CLOCK\$|NUL|CON|COM\d|LPT\d)$
И для недопустимых символов это исключит все заданные символы:
# 2
^[^\x00-\x1F\xA5\\?*:\"";|\/<>]+$
, но это все еще позволяет .
, a.
и .a
. Чтобы исключить эти три возможности, вам необходимо:
сначала добавить (?!(?:\..+)?$)
в начало, чтобы исключить имена, начинающиеся с .
(то есть \.
)
, затем добавить (?<![.])
в конец для исключения имен, оканчивающихся на .
# 3
^(?!(?:\..+)?$).+(?<![.])$
Но это позволит много других возможностей с пробелами в начале и в конце.
На этом этапе вы можете обрезать текст, игнорировать недопустимые имена (Windows обрежет их) или расширить свое регулярное выражение следующим образом:
добавление \x20
исключает
a
и a.
, но все же позволяет a
и .a
^(?!(?:\..+)?$).+(?<![\x20.])$
добавление (?!(?:\x20+.+)?$)
исключает начальные пробелы:
# 3
^(?!(?:\x20+.+)?$)(?!(?:\..+)?$).+(?<![\x20.])$