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

Вопрос:В настоящее время я ищу регулярное выражение, которое может помочь проверить путь к файлу, например: C:testtest2test.exe Лучший ответ: Я решил опубликовать этот ответ, который использует регулярное выражение. ^(?:[a-zA-Z]:|\[w.]+[w.$]+)(?:[w]+)*w([w.])+$ Работает для них: testtest$TEST.xls serversharefoldermyfile.txt serversharemyfile.txt 123.123.123.123sharefoldermyfile.txt c:foldermyfile.txt c:foldermyfileWithoutExtension Изменить: добавлено использование примера: if (Regex.IsMatch (text, @"^(?:[a-zA-Z]:|\[w.]+[w.$]+)(?:[w]+)*w([w.])+$")) { // Valid } * Edit: * Это приблизительное количество

Вопрос:

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

C:testtest2test.exe Лучший ответ:

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

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

Работает для них:

\testtest$TEST.xls \serversharefoldermyfile.txt \serversharemyfile.txt \123.123.123.123sharefoldermyfile.txt c:foldermyfile.txt c:foldermyfileWithoutExtension

Изменить: добавлено использование примера:

if (Regex.IsMatch (text, @»^(?:[a-zA-Z]:|\\[w.]+\[w.$]+)\(?:[w]+\)*w([w.])+$»)) { // Valid }

* Edit: * Это приблизительное количество путей, которые вы могли видеть. Если возможно, вероятно, лучше использовать класс Path или FileInfo, чтобы узнать, существует ли файл или папка.

Ответ №1

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

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

Ответ №2

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

^(?:[a-zA-Z]:(\|/)|file://|\\|.(/|\))([^\/:*?<>»|]+(\|/){0,1})+$ Ответ №3

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

Ответ №4

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

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

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

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

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

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

Ответ №5

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

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

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

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

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

Win Regex

Unix Regex

Работает с Javascript

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

Ответ №6regex CmdPrompt(«^([A-Z]:[^<>:»|?*]+>)»);

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

< (less than) > (greater than) : (colon) » (double quote) | (vertical bar or pipe) ? (question mark) * (asterisk) Ответ №7

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

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

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-networksomelocation», @»\my-network\somelocation», @»\my-networksomelocation», @»my-networksomelocation», @»\my-network\somelocation»,@»\my-networksomelocationaadd», @»\my-networksomelocation»,@»\my-network\somelocation»}; foreach (string name in names) { if (Regex.IsMatch(name, pattern)) { Console.WriteLine(name); //Directory.Exists function to check if file exists } } Ответ №8

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

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

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

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

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

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

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

Оцените статью
Добавить комментарий