20

I have a regexp to validate file names. Here is it:

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

It should allow file names like this:

aaa
aaa.ext
a#
A9#.ext

The following characters are not allowed \ / : * ? \" < > |

The problem is that file names like *.txt or /\kk passes the validation. I am doing validation with keyup event. So when I put one extra character after not allowed one it shows that everything is correct.

1
  • the accepted answer fixed your regex, but your regex is not correct for checking Windows filenames. see here Commented Aug 9, 2018 at 10:15

7 Answers 7

43

For Windows names.

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');
Sign up to request clarification or add additional context in comments.

8 Comments

Escape / with \ in rg1. At least, VS 2010 thinks so.
^(?!\.)(?!com[0-9]$)(?!con$)(?!lpt[0-9]$)(?!nul$)(?!prn$)[^\|*\?\\:<>/$"]*[^\.\|*\?\\:<>/$"]+$
Thanks @RyanWilliams for comment. But I know way to create file in Windows with long file name that contains dot in the end of file name and without extention :)
It should be return !rg1.test(fname) && !rg2.test(fname) && !rg3.test(fname); I guess.
AUX is missing, COM0 is actually valid, starting with "." is actually valid... ref
|
9

You need to add a starting anchor:

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

This tells the engine to match from the start of the input all the way to the end of the input, whereas for your original expression it only needs to match at the end of the input.

Comments

9

You need to anchor the expression by using ^ and $. For example:

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

Note that you need to escape - in a character class, or place it first/last.

1 Comment

Can you tell a bit what this regex does?
5
/^(?!\.)(?!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 .

1 Comment

/ (forward slash) is missing, AUX is missing, COM0 is actually valid, starting with "." is actually valid.... ref
5

Since this post (regex-for-windows-file-name) redirects to this question, I assume its about windows file names.

And based on the comment and reference by @Leon on the answer by @AndrewD, I made this regular expression and it works for me.

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

According to the naming-conventions (see reference above), I agree that "com0" should be a valid file name, but its not working if you try to name a file "com0" on windows, so I guess thats missing in the article.

So this regular expression would be more safe

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

1 Comment

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

try this:

^[0-9a-z_\-]{3,255}\.([a-z0-9]{2,5})$

its for any filename with minimum 3 chars and max length from 255 and an extension from 2 till 5 chars... the chars of the filename itself allowed for numbers, chars and minus sign and underscore ... maybe its helpful.

Comments

0

I would try something with this Regex (you can even make a validation attribute for ASP.NET MVC with it!):

@"^[^\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]*$"

If it matches the input, it is valid filename (at least on Windows).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.