我有一个用于密码验证的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}$/;
我试图使用regex
库将其翻译成Rust正则表达式;但它似乎不支持lookahead: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;
}
在不使用lookahead的情况下,验证具有多个条件的字符串的常用方法是什么?
编辑:这是可能的,使用正则表达式,这里的一个版本在操场上:是的。
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提供的版本要干净得多。
2条答案
按热度按时间x6yk4ghg1#
下面是一个不使用正则表达式的解决方案。
Playground link
ojsjcaue2#
}