Suppose we have a full path string of a file like this


We want to split it to two parts: directory path and file name


Its a pretty common task in administration programming. There are a lot of ways to accomplish it. Now consider how to do it in Clojure. First the file name part can be matched with a regular expression, what we need to match is from the last back slash to the end of the string. Here is the regular expression.


This regular expression says matching start from a back slash and any number of characters that is not a back slash to the end.

Clojure provided a function re-find to match a string with regular expression, lets see what it output:

(re-find #"\\([^\\]*$)" "c:\\dir1\\dir2\\file.pdf")
["\\file.pdf" "file.pdf"]

Now we want to match all the rest substring that not part of the file name part, we can construct a regular expression based on the first one.

(re-find #"(.*)\\[^\\]*" "c:\\dir1\\dir2\\file.pdf")
["c:\\dir1\\dir2\\file.pdf" "c:\\dir1\\dir2"]

With the two regular expression, the function is easy to write:

(defn split-fileloc-file [file]
  (let [re #"\\([^\\]*$)"
        re-others #"(.*)\\[^\\]*"
    {:fileloc (second (re-find re-others file)) :file (second (re-find re file))}
(split-fileloc-file "c:\\dir1\\dir2\\file.pdf")
{:fileloc "c:\\dir1\\dir2", :file "file.pdf"}