Подтвердить что ты не робот

С# - регулярное выражение для путей к файлам, например. C:\Test\test.exe

В настоящее время я ищу регулярное выражение, которое может помочь проверить путь к файлу, например:

C:\test\test2\test.exe
4b9b3361

Ответ 1

Я решил опубликовать этот ответ, который использует регулярное выражение.

^(?:[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, чтобы узнать, существует ли файл или папка.

Ответ 2

Я бы рекомендовал использовать Path class вместо Regex, если ваша цель - работать с именами файлов.

Например, вы можете вызвать Path.GetFullPath, чтобы "проверить" путь, поскольку он поднимет ArgumentException, если этот путь содержит недопустимые символы, а также другие исключения, если путь слишком длинный и т.д. Это будет обрабатывать все правила, которые будут трудно получить с помощью регулярного выражения.

Ответ 3

Предлагаемый вариант не очень хорош, этот я создаю для XSD, это зависит от Windows:

^(?:[a-zA-Z]\:(\\|\/)|file\:\/\/|\\\\|\.(\/|\\))([^\\\/\:\*\?\<\>\"\|]+(\\|\/){0,1})+$

Ответ 4

Попробуйте это для поддержки Windows и Linux: ((?:[a-zA-Z]\:){0,1}(?:[\\/][\w.]+){1,})

Ответ 5

Я использую это регулярное выражение для захвата допустимых путей файлов/папок в Windows (включая UNC и% переменных%), исключая корневые пути, такие как "C: \" или "\\ serverName"

^(([a-zA-Z]:|\\\\\w[ \w\.]*)(\\\w[ \w\.]*|\\%[ \w\.]+%+)+|%[ \w\.]+%(\\\w[ \w\.]*|\\%[ \w\.]+%+)*)

это регулярное выражение не соответствует ведущим пробелам в элементах пути, поэтому

  • "C:\program files" соответствует
  • "C:\pathWithLeadingSpace" не сопоставляется

допустимы переменные на любом уровне

  • "% программных файлов%" соответствует
  • "C:\мой путь с внутренними пространствами\%мой var с внутренними пространствами%" соответствует

Ответ 6

Это регулярное выражение для путей Windows:

(^([a-z]|[A-Z]):(?=\\(?![\0-\37<>:"/\\|?*])|\/(?![\0-\37<>:"/\\|?*])|$)|^\\(?=[\\\/][^\0-\37<>:"/\\|?*]+)|^(?=(\\|\/)$)|^\.(?=(\\|\/)$)|^\.\.(?=(\\|\/)$)|^(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+)|^\.\.(?=(\\|\/)[^\0-\37<>:"/\\|?*]+))((\\|\/)[^\0-\37<>:"/\\|?*]+|(\\|\/)$)*()$

И это для путей UNIX/Linux

^\/$|(^(?=\/)|^\.|^\.\.)(\/(?=[^/\0])[^/\0]+)*\/?$

Вот мои тесты:

Win Regex

Unix Regex

Работает с Javascript

ИЗМЕНИТЬ Я добавил относительные пути, (../,./,../something)

Ответ 7

regex CmdPrompt("^([A-Z]:[^\<\>\:\"\|\?\*]+>)");

В основном мы ищем все, что не входит в список запрещенных символов пути Windows:

< (less than)
> (greater than)
: (colon)
" (double quote)
| (vertical bar or pipe)
? (question mark)
* (asterisk)

Ответ 8

Я нашел большинство ответов здесь, чтобы немного погубить или пропустить.

Нашел здесь хорошее решение:

https://social.msdn.microsoft.com/forums/vstudio/en-US/31d2bc84-c948-4914-8a9d-97b9e788b341/validate-a-network-folder-path

Примечание * - это только для общих сетевых ресурсов, а не для локальных файлов

Ответ:

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
 }
}   

Ответ 9

Ответ Alexander + Относительные пути

Александр имеет самый правильный ответ до сих пор, так как он поддерживает пробелы в именах файлов (т.е. C:\Program Files (x86)\ будет соответствовать)... Это также включает относительные пути.

Например, вы можете сделать cd / или cd \, и он делает то же самое.

Кроме того, если вы в настоящее время находитесь в C:\some\path\to\some\place и вы вводите одну из этих команд, вы попадаете в C:\

Более того, вам следует рассмотреть пути, которые начинаются с '/' в качестве корневого пути (к текущему диску).

(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\)|/)([^,\/:*\?\<>\"\|]+(\|/){0,1})

Измененная версия Alexander ответит, однако мы включаем пути, которые не относятся к ведущему / или букве диска, а также / без ведущей буквы диска (относительно текущего диска с правами root).