Как определить, что строка является форматом пути Windows в Rust?

Понятно: PathBuf::from не проверяет, будет ли путь принят. Единственное, что он проверяет, это то, что путь закодирован правильно.

fn check(path: &str) -> bool {
    //DO CHECK
}

Итак, как я могу судить, что строка является допустимым путем Windows, независимо от того, существует ли она;

Может ли это соответствовать только регулярным выражениям? Я нашел регулярное выражение в Windows Path Regex - RegExr: /^(?:[a-zA-Z]\:|\\\\[\w\s\.]+\\[\w\s\.$]+)\\(?:[\w\s\.]+\\)*[\w\s\.]*?$/.

После тестирования приведенного выше регулярного выражения его нельзя использовать в ржавчине.

if ! Regex::new(r"^(?:[a-zA-Z]\:|\\\\[\w\s\.]+\\[\w\s\.$]+)\\(?:[\w\s\.]+\\)*[\w\s\.]*?$").unwrap().is_match(r"D:\test") {
    println!("Link Path [{}] is invalid.", r"D:\test");
    return;
}

Ошибка:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Syntax(
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
regex parse error:
    ^(?:[a-zA-Z]\:|\\\\[\w\s\.]+\\[\w\s\.$]+)\\(?:[\w\s\.]+\\)*[\w\s\.]*?$
                ^^
error: unrecognized escape sequence
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
)'

Регулярное выражение в вашем коде не соответствует регулярному выражению в сообщении об ошибке. Он также не соответствует регулярному выражению, которое вы нашли (существует разное количество обратных косых черт).

cdhowie 14.04.2023 06:11

Спасибо за напоминание, я отредактировал; но проблема все еще существует, не могли бы вы помочь мне ее проанализировать. @cdhowie

Kerwin Bryant 14.04.2023 06:23
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
70
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

\: не является допустимой управляющей последовательностью в регулярных выражениях Rust. Предположительно, диалект регулярных выражений, для которого было написано это регулярное выражение, принимает \: как буквальное :. Либо символ : является особым в этом диалекте, либо диалект допускает экранирование неспециальных символов (то есть он будет рассматривать \: и : как эквивалентные). Регулярные выражения Rust не поддерживают экранирование неспециальных символов.

В этом случае решение, по-видимому, состоит в том, чтобы просто заменить \: на :, поскольку регулярное выражение, похоже, обрабатывает букву диска Windows/DOS. После этого изменения регулярное выражение успешно анализируется и работает правильно в примере, указанном в вашем вопросе.

спасибо, есть ли другой способ, кроме использования регулярных выражений? При условии, что не используются трехсторонние зависимости.

Kerwin Bryant 14.04.2023 07:33

@KerwinBryant Всегда есть синтаксические анализаторы, созданные вручную, если вы хотите создать их самостоятельно. Это зависит от того, какая у вас цель.

cdhowie 14.04.2023 07:46

Моя цель описана выше, я надеюсь определить, является ли строка допустимым путем к ресурсам Windows; приведенный выше пример кода может достичь моей цели, но из-за введения регулярных выражений мой двоичный пакет увеличился с 300 КБ до 1 МБ. Итак, я спрашиваю, как я изначально спрашивал, есть ли метод в стандартной библиотеке, который бы удовлетворить мою цель?

Kerwin Bryant 14.04.2023 08:54

Я думаю о решении. Например, если я хочу определить, является ли [X:\xyz] допустимым путем к ресурсам Windows, я могу перехватить root: [\xyz], а затем соединить оставшийся путь с %temp%: [%temp%\xyz] , а затем создать этот каталог, если он может быть успешно создан, он считается законным; в противном случае это не законно; Почему бы не создать [X:\xyz] напрямую, потому что диск [X] может не существовать, но это не влияет на [X:\xyz] — это допустимый формат пути к ресурсам Windows.

Kerwin Bryant 14.04.2023 08:59
crates.io/crates/test_path
Kerwin Bryant 15.04.2023 17:36

@KerwinBryant Неясно, является ли ваша цель определить, является ли путь синтаксически допустимым или он относится к месту, в которое ваша программа может писать. Если это последнее, обычный подход состоит в том, чтобы просто попытаться написать туда и сообщить об ошибке, если вы не можете, и, таким образом, полностью обойти проверку.

cdhowie 16.04.2023 15:50

Другие вопросы по теме