2012-06-19 7 views
8

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

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

Это должно позволить имена файлов, как это:

aaa 
aaa.ext 
a# 
A9#.ext 

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

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

ответ

7

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

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

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

6

Вам необходимо привязать выражение, используя ^ и $. Например:

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

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

24

Для имен 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'); 
+1

Escape/with \ in rg1. По крайней мере, VS 2010 так считает. – noober

+1

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

+0

Спасибо @RyanWilliams за комментарий. Но я знаю способ создания файла в Windows с длинным именем файла, содержащим точку в конце имени файла и без расширения :) –

2
/^(?!\.)(?!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 . 
0

Я хотел бы попробовать что-то с этим 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).

Смежные вопросы