В настоящее время я ищу регулярное выражение, которое может помочь проверить путь к файлу, например:
C:\test\test2\test.exe
В настоящее время я ищу регулярное выражение, которое может помочь проверить путь к файлу, например:
C:\test\test2\test.exe
Я решил опубликовать этот ответ, который использует регулярное выражение.
^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$
Работает для них:
\\test\test$\TEST.xls
\\server\share\folder\myfile.txt
\\server\share\myfile.txt
\\123.123.123.123\share\folder\myfile.txt
c:\folder\myfile.txt
c:\folder\myfileWithoutExtension
Изменить: добавлено использование примера:
if (Regex.IsMatch (text, @"^(?:[a-zA-Z]\:|\\\\[\w\.]+\\[\w.$]+)\\(?:[\w]+\\)*\w([\w.])+$"))
{
// Valid
}
* Edit: * Это приблизительное количество путей, которые вы могли видеть. Если возможно, вероятно, лучше использовать класс Path или FileInfo, чтобы узнать, существует ли файл или папка.
Я бы рекомендовал использовать Path class вместо Regex, если ваша цель - работать с именами файлов.
Например, вы можете вызвать Path.GetFullPath, чтобы "проверить" путь, поскольку он поднимет ArgumentException
, если этот путь содержит недопустимые символы, а также другие исключения, если путь слишком длинный и т.д. Это будет обрабатывать все правила, которые будут трудно получить с помощью регулярного выражения.
Предлагаемый вариант не очень хорош, этот я создаю для XSD, это зависит от Windows:
^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$
Попробуйте это для поддержки Windows и Linux: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})
Я использую это регулярное выражение для захвата допустимых путей файлов/папок в Windows (включая UNC и% переменных%), исключая корневые пути, такие как "C: \" или "\\ serverName"
^(([a-zA-Z]:|\\\\\w[ \w\.]*)(\\\w[ \w\.]*|\\%[ \w\.]+%+)+|%[ \w\.]+%(\\\w[ \w\.]*|\\%[ \w\.]+%+)*)
это регулярное выражение не соответствует ведущим пробелам в элементах пути, поэтому
допустимы переменные на любом уровне
Это регулярное выражение для путей Windows:
(^([a-z]|[A-Z]):(?=\\(?![\0-\37<>:"/\\|?*])|\/(?![\0-\37<>:"/\\|?*])|$)|^\\(?=[\\\/][^\0-\37<>:"/\\|?*]+)|^(?=(\\|\/)$)|^\.(?=(\\|\/)$)|^\.\.(?=(\\|\/)$)|^(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+))((\\|\/)[^\0-\37<>:"/\\|?*]+|(\\|\/)$)*()$
И это для путей UNIX/Linux
^\/$|(^(?=\/)|^\.|^\.\.)(\/(?=[^/\0])[^/\0]+)*\/?$
Вот мои тесты:
Работает с Javascript
ИЗМЕНИТЬ Я добавил относительные пути, (../,./,../something)
regex CmdPrompt("^([A-Z]:[^\<\>\:\"\|\?\*]+>)");
В основном мы ищем все, что не входит в список запрещенных символов пути Windows:
< (less than)
> (greater than)
: (colon)
" (double quote)
| (vertical bar or pipe)
? (question mark)
* (asterisk)
Я нашел большинство ответов здесь, чтобы немного погубить или пропустить.
Нашел здесь хорошее решение:
Примечание * - это только для общих сетевых ресурсов, а не для локальных файлов
Ответ:
string pattern = @"^\\{2}[\w-]+(\\{1}(([\w-][\w-\s]*[\w-]+[$$]?)|([\w-][$$]?$)))+";
string[] names = { @"\\my-network\somelocation", @"\\my-network\\somelocation",
@"\\\my-network\somelocation", @"my-network\somelocation",
@"\\my-network\\somelocation",@"\\my-network\somelocation\aa\dd",
@"\\my-network\somelocation\",@"\\my-network\\somelocation"};
foreach (string name in names)
{
if (Regex.IsMatch(name, pattern))
{
Console.WriteLine(name);
//Directory.Exists function to check if file exists
}
}
Александр имеет самый правильный ответ до сих пор, так как он поддерживает пробелы в именах файлов (т.е. C:\Program Files (x86)\
будет соответствовать)... Это также включает относительные пути.
Например, вы можете сделать cd /
или cd \
, и он делает то же самое.
Кроме того, если вы в настоящее время находитесь в C:\some\path\to\some\place
и вы вводите одну из этих команд, вы попадаете в C:\
Более того, вам следует рассмотреть пути, которые начинаются с '/' в качестве корневого пути (к текущему диску).
(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/)([^,\/:*\?\<>\"\|]+(\|/){0,1})
Измененная версия Alexander ответит, однако мы включаем пути, которые не относятся к ведущему /
или букве диска, а также /
без ведущей буквы диска (относительно текущего диска с правами root).