Понятно: 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





\: не является допустимой управляющей последовательностью в регулярных выражениях Rust. Предположительно, диалект регулярных выражений, для которого было написано это регулярное выражение, принимает \: как буквальное :. Либо символ : является особым в этом диалекте, либо диалект допускает экранирование неспециальных символов (то есть он будет рассматривать \: и : как эквивалентные). Регулярные выражения Rust не поддерживают экранирование неспециальных символов.
В этом случае решение, по-видимому, состоит в том, чтобы просто заменить \: на :, поскольку регулярное выражение, похоже, обрабатывает букву диска Windows/DOS. После этого изменения регулярное выражение успешно анализируется и работает правильно в примере, указанном в вашем вопросе.
спасибо, есть ли другой способ, кроме использования регулярных выражений? При условии, что не используются трехсторонние зависимости.
@KerwinBryant Всегда есть синтаксические анализаторы, созданные вручную, если вы хотите создать их самостоятельно. Это зависит от того, какая у вас цель.
Моя цель описана выше, я надеюсь определить, является ли строка допустимым путем к ресурсам Windows; приведенный выше пример кода может достичь моей цели, но из-за введения регулярных выражений мой двоичный пакет увеличился с 300 КБ до 1 МБ. Итак, я спрашиваю, как я изначально спрашивал, есть ли метод в стандартной библиотеке, который бы удовлетворить мою цель?
Я думаю о решении. Например, если я хочу определить, является ли [X:\xyz] допустимым путем к ресурсам Windows, я могу перехватить root: [\xyz], а затем соединить оставшийся путь с %temp%: [%temp%\xyz] , а затем создать этот каталог, если он может быть успешно создан, он считается законным; в противном случае это не законно; Почему бы не создать [X:\xyz] напрямую, потому что диск [X] может не существовать, но это не влияет на [X:\xyz] — это допустимый формат пути к ресурсам Windows.
@KerwinBryant Неясно, является ли ваша цель определить, является ли путь синтаксически допустимым или он относится к месту, в которое ваша программа может писать. Если это последнее, обычный подход состоит в том, чтобы просто попытаться написать туда и сообщить об ошибке, если вы не можете, и, таким образом, полностью обойти проверку.
Регулярное выражение в вашем коде не соответствует регулярному выражению в сообщении об ошибке. Он также не соответствует регулярному выражению, которое вы нашли (существует разное количество обратных косых черт).