Вопрос:
В настоящее время я ищу регулярное выражение, которое может помочь проверить путь к файлу, например:
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
^/$|(^(?=/)|^.|^..)(/(?=[^/ ])[^/ ]+)*/?$
Вот мои тесты:
Работает с Javascript
ИЗМЕНИТЬ
Я добавил относительные пути, (../,./,../something)
Ответ №6regex CmdPrompt(«^([A-Z]:[^<>:»|?*]+>)»);
В основном мы ищем все, что не входит в список запрещенных символов пути Windows:
< (less than) > (greater than) : (colon) » (double quote) | (vertical bar or pipe) ? (question mark) * (asterisk) Ответ №7
Я нашел большинство ответов здесь, чтобы немного погубить или пропустить.
Нашел здесь хорошее решение:
Примечание * – это только для общих сетевых ресурсов, а не для локальных файлов
Ответ:
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).