Ответ 1
Вам нужно добавить стартовый якорь:
/^[0-9a-zA-Z ... ]+$/
Это говорит, что движок должен совпадать с началом ввода до конца ввода, тогда как для вашего исходного выражения он должен соответствовать только в конце ввода.
У меня есть регулярное выражение для проверки имен файлов. Вот он:
/[0-9a-zA-Z\^\&\'\@\{\}\[\]\,\$\=\!\-\#\(\)\.\%\+\~\_ ]+$/
Он должен разрешать имена файлов следующим образом:
aaa
aaa.ext
a#
A9#.ext
Следующие символы не допускаются \ / : * ? \" < > |
Проблема заключается в том, что имена файлов, такие как *.txt
или /\kk
, проходят проверку. Я выполняю проверку с помощью события keyup. Поэтому, когда я помещаю один дополнительный символ после того, как его не разрешили, он показывает, что все правильно.
Вам нужно добавить стартовый якорь:
/^[0-9a-zA-Z ... ]+$/
Это говорит, что движок должен совпадать с началом ввода до конца ввода, тогда как для вашего исходного выражения он должен соответствовать только в конце ввода.
Для имен 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');
Вам нужно привязать выражение с помощью ^
и $
. Например:
/^[-\w^&'@{}[\],$=!#().%+~ ]+$/
Обратите внимание, что вам нужно выйти из -
в класс символов или поместить его первым/последним.
/^(?!\.)(?!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 .
Я бы попробовал что-то с этим 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).
Поскольку этот пост (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