There's not a single, simple RE that will work for file paths. Some factors: absolute vs relative, local vs file share, UNC vs device paths, file vs shell. Making this even more complex is that ultimately the file system itself determines "valid". For example a UDF drive would not allow really long file names even though an NTFS might. It isn't just a simple pattern matching. Furthermore subpaths may follow different rules. For example 'C$' is allowed as part of a file share path and UNC but it wouldn't necessarily work in the middle of an arbitrary directory structure.
Even Windows doesn't provide an actual function to do this (but it does provide some that could help) because you cannot really validate a file path without calling to the file system and you may not be validating that the file path exists (and hence a file system to call to).
Personally I would just make a best guess estimate by using Path.GetInvalidPathChars, Path.GetInvalidFileNameChars, and Path.DirectorySeparatorChar (along with AltDirectorySeperatorChar
and perhaps VolumeSeparatorChar
to parse the string.
I would probably start by trying to figure out UNC vs local. For local then you'd need relative vs absolute. Ignoring device paths you could find the volume separator and validate. Then you move on to parsing the path by splitting using the dir/alt-dir characters and String.Split. Next you validate each subpath using the invalid path method mentioned earlier. For the filename (if any) you then would validate using the invalid filename method. If all this checks out then the path is probably valid (but there are no real guarantees).
If you really want to just do minimal RE then take a look at this excerpt which provides some guidance.