7.22. Extract the Folder from a Windows Path
Problem
You have a string that holds a (syntactically) valid path to a
file or folder on a Windows PC or network, and you want to extract the
folder from the path. For example, you want to extract \folder\subfolder\
from
c:\folder\subfolder\file.ext
or
\\server\share\folder\subfolder\file.ext
.
Solution
^([a-z]:|\\\\[a-z0-9_.$]+\\[a-z0-9_.$]+)?((?:\\|^)↵ (?:[^\\/:*?"<>|\r\n]+\\)+)
Regex options: Case insensitive |
Regex flavors: .NET, Java, JavaScript, PCRE, Perl, Python, Ruby |
Discussion
Extracting the folder from a Windows path is a bit tricky if we want to support UNC paths, because we can’t just grab the part of the path between backslashes. If we did, we’d be grabbing the server and share from UNC paths too.
The first part of the regex, ‹^([a-z]:|\\\\[a-z0-9_.$]+\\[a-z0-9_.$]+)?
›,
skips over the drive letter or the network server and network share
names at the start of the path. This piece of the regex consists of a
capturing group with two alternatives. The first alternative matches
the drive letter, as in Recipe 7.20, and the
second alternative matches the server and share in UNC paths, as in
Recipe 7.21. Recipe 2.8 explains the alternation
operator.
The question mark after the group makes it optional. This allows us to support relative paths, which don’t have a drive letter or network share.
The folders are easily matched with ‹(?:[^\\/:*?"<>|\r\n]+\\)+
›. The character class matches a folder name. The noncapturing group matches a folder name ...
Get Regular Expressions Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.