Повторное выражение Javascript для проверки имен файлов

У меня есть регулярное выражение для проверки имен файлов. Вот он:

/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/

Он должен разрешать имена файлов следующим образом:

aaa
aaa.ext
a#
A9#.ext

Следующие символы не допускаются \ / : * ? \" < > |

Проблема заключается в том, что имена файлов, такие как *.txt или /\kk, проходят проверку. Я выполняю проверку с помощью события keyup. Поэтому, когда я помещаю один дополнительный символ после того, как его не разрешили, он показывает, что все правильно.

Ответ 1

Вам нужно добавить стартовый якорь:

/^[0-9a-zA-Z ... ]+$/

Это говорит, что движок должен совпадать с началом ввода до конца ввода, тогда как для вашего исходного выражения он должен соответствовать только в конце ввода.

Ответ 2

Для имен Windows.

var isValid=(function(){
  var rg1=/^[^\\/:\*\?"<>\|]+$/; // forbidden characters \ / : * ? " < > |
  var rg2=/^\./; // cannot start with dot (.)
  var rg3=/^(nul|prn|con|lpt[0-9]|com[0-9])(\.|$)/i; // forbidden file names
  return function isValid(fname){
    return rg1.test(fname)&&!rg2.test(fname)&&!rg3.test(fname);
  }
})();

isValid('file name');

Ответ 3

Вам нужно привязать выражение с помощью ^ и $. Например:

/^[-\w^&'@{}[\],$=!#().%+~ ]+$/

Обратите внимание, что вам нужно выйти из - в класс символов или поместить его первым/последним.

Ответ 4

/^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\|\*\?\\:<>/$"]*[^\.\|\*\?\\:<>/$"]+$/

Must not be empty.
Must not start with .
Must not be com0-com9, con, lpt0-lpt9, nul, prn
Must not contain | * ? \ : < > $
Must not end with .

Ответ 5

Я бы попробовал что-то с этим Regex (вы даже можете сделать атрибут проверки для ASP.NET MVC с ним!):

@"^[^\u0022\u003C\u003E\u007C\u0000\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u0009\u000A\u000B\u000C\u000D\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u003A\u002A\u003F\u005C\u002F]*$"

Если он соответствует вводу, он является действительным именем файла (по крайней мере, в Windows).

Ответ 6

Поскольку этот пост (regex-for-windows-file-name) перенаправляется на этот вопрос, я предполагаю его имена файлов Windows.

И на основе комментария и ссылки @Leon на ответ @AndrewD, я сделал это регулярное выражение, и оно работает для меня.

/^(con|prn|aux|nul|com[1-9]|lpt[1-9])$|([<>:"\/\\|?*])|(\.|\s)$/ig

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

Таким образом, это регулярное выражение будет более безопасным

/^(con|prn|aux|nul|com[0-9]|lpt[0-9])$|([<>:"\/\\|?*])|(\.|\s)$/ig