Регулярное выражение Javascript в регулярное выражение Rust

У меня есть регулярное выражение Javascript для проверки пароля:

// Validates password with
// — No white spaces
// — At least one upper case English letter, (?=.*?[A-Z])
// — At least one lower case English letter, (?=.*?[a-z])
// — At least one digit, (?=.*?[0-9])
// — Minimum eight in length .{8,} (with the anchors)

const passwordRegex = /^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{6,10}$/;

Я пытаюсь перевести его в регулярное выражение Rust, используя библиотеку regex; но кажется, что он не поддерживает просмотр вперед: https://docs.rs/regex/latest/regex/

use regex::Regex;

pub fn validate_password(string: &str) -> bool {
  let regex_no_whitespaces = Regex::new(r"^\s*\S+\s*$").unwrap();
  let regex_password = Regex::new(r"^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9]).{6,10}$").unwrap();
  let password_valid = regex_password.is_match(&string);
  let password_has_no_whitespaces = regex_no_whitespaces.is_match(&string);
  let is_valid = password_valid && password_has_no_whitespaces;

  return is_valid;
}

Каков общий способ проверки строки с несколькими условиями без просмотра вперед?

Обновлено: это можно сделать с помощью Regex, здесь версия на игровой площадке: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=c6f69f5018e38677af1624a7bfcd186c.

pub fn validate_password(string: &str) -> bool {
  let regex_no_whitespaces = Regex::new(r"^\s*\S+\s*$").unwrap();
  let no_whitespaces = regex_no_whitespaces.is_match(&string);
  let regex_one_uppercase = Regex::new(r"[a-z]{1,}").unwrap();
  let one_uppercase = regex_one_uppercase.is_match(&string);
  let regex_one_lowercase = Regex::new(r"[A-Z]{1,}").unwrap();
  let one_lowercase = regex_one_lowercase.is_match(&string);
  let regex_one_digit = Regex::new(r"[0-9]{1,}").unwrap();
  let one_digit = regex_one_digit.is_match(&string);
  let regex_length = Regex::new(r".{8,}").unwrap();
  let length = regex_length.is_match(&string);

  let is_valid = no_whitespaces && one_uppercase && one_lowercase && one_digit && length;

  return is_valid;
}

Но версия, предоставленная @sirdarius, намного чище.

Вы можете просто использовать несколько регулярных выражений: одно утверждает, что есть заглавная буква, другое утверждает, что есть строчная буква, третье утверждает, что есть цифра, а третье проверяет длину. Или... вы можете делать все это без использования регулярных выражений? Rust — компилируемый низкоуровневый язык, поэтому делать это «вручную» будет не медленнее, чем с помощью регулярных выражений.

user4815162342 09.04.2022 17:33

«вы можете делать эти вещи без использования регулярных выражений»: интересно, как? Можете ли вы привести пример?

Emille C. 09.04.2022 17:34

Вы можете сделать то, что предлагает ответ, или вы можете использовать методы итератора all() и any(), чтобы сделать его еще чище: play.rust-lang.org/…

user4815162342 09.04.2022 18:47

Это хороший

Emille C. 09.04.2022 19:30
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
4
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

fn is_password_valid(s: &str) -> bool {
    let mut has_whitespace = false;
    let mut has_upper = false;
    let mut has_lower = false;
    let mut has_digit = false;

    for c in s.chars() {
        has_whitespace |= c.is_whitespace();
        has_lower |= c.is_lowercase();
        has_upper |= c.is_uppercase();
        has_digit |= c.is_digit(10);
    }

    !has_whitespace && has_upper && has_lower && has_digit && s.len() >= 8
}

Ссылка на игровую площадку

Большое спасибо, это здорово. Я только что написал это: play.rust-lang.org/…, но у вас намного чище.

Emille C. 09.04.2022 17:49

Извините, я перевернул условие "без пробелов". Исправление.

SirDarius 09.04.2022 17:53

Спасибо, я только что заметил. Он прекрасно работает и читается лучше, чем версия с несколькими регулярными выражениями. Будет использовать это

Emille C. 09.04.2022 17:56

«Если все, что у вас есть, это молоток, все выглядит как гвоздь». Регулярные выражения — хороший инструмент, но немного избыточный для такой проблемы =)

SirDarius 09.04.2022 18:05

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