Регулярное выражение 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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