Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regular expression to match a valid absolute Windows directory containing spaces

Tags:

regex

I would like a regular expression to match a valid absolute Windows directory path, where directory names can contain spaces.

Example matches:

C:\pictures\holiday  (without trailing backslash)
C:\pictures\holiday\ (or with trailing backslash)
C:\ pictures\holiday
C:\ pictures\holiday\
C:\pictures \ holiday
C:\pictures \ holiday\
C:\pictures\ holiday \

Example fails:

\pictures\holiday (no relative path allowed)
C:\pictures*\holiday (not a valid directory path)

I have tried ^[a-zA-Z]:(\\\w+)*([\\])?$ but that does not match the spaces.

I have also tried ^[a-zA-Z]:(\s)*(\\\w+)*(\s)*([\\])?$ but that works erratically.

Regular expressions are my last resort. I have also tried to validate the text box using a non-regex solution, like in this answer. But I have not found a method that works for spaces.

Thanks in advance!

like image 614
InvalidBrainException Avatar asked Jul 11 '14 16:07

InvalidBrainException


1 Answers

Here's a regex that will work:

^[a-zA-Z]:\\(((?![<>:"/\\|?*]).)+((?<![ .])\\)?)*$

It makes the path conform to the NTFS standard (see the MSDN spec). I'll break it down:

^[a-zA-Z]:\\ matches single drive letter, with colon and backslash

(?![<>:"/\\|?*]) is a negative lookahead to ensure the next character is not invalid

((?![<>:"/\\|?*]).)+ wraps that lookahead, followed by the next character, any number of times

(?<![ .])\\ is a negative lookbehind to ensure the file/directory doesn't end with a space or period. Please note: Lookbehinds are not fully implemented everywhere just yet.

All of that is is repeated 0 to many times, with the last backslash optional.

For many use cases it may be best to restrict the path length to 256 characters. To do so, replace *with {0,256}.

EDIT: allow root directory

like image 120
Brian Stephens Avatar answered Nov 03 '22 17:11

Brian Stephens