pub fn validate_address(address: &str) -> bool {
if address.is_empty() {
return false;
}
let char_count = address.chars().count();
if char_count < 5 || char_count > 100 {
return false;
}
for c in address.chars() {
if ('\u{4e00}'..='\u{9fa5}').contains(&c) {
continue;
}
if c.is_ascii_alphabetic() {
continue;
}
if c.is_ascii_digit() {
continue;
}
if c.is_ascii_whitespace() {
continue;
}
match c {
',' | '.' | '-' | '_' | '/' | '\\' | '#' | '@' | '&' | '*' | '+' | '=' | '|' | ':'
| ';' | '!' | '?' | '(' | ')' | '[' | ']' | '{' | '}' | '<' | '>' | ',' | '。'
| '、' | ';' | ':' | '!' | '?' | '(' | ')' | '【' | '】' | '《' | '》' | '—'
| '·' => continue,
_ => return false,
}
}
true
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_valid_addresses() {
assert!(validate_address("北京市朝阳区xxx街道xxx号"));
assert!(validate_address("上海市浦东新区世纪大道100号"));
assert!(validate_address("广东省广州市天河区体育西路123号"));
assert!(validate_address("Building A, No.123, Street Name, Beijing"));
assert!(validate_address("XX小区5号楼301室"));
}
#[test]
fn test_invalid_addresses() {
assert!(!validate_address(""), "空字符串应该返回false");
let test_str = "北京";
println!("字符串: '{}'", test_str);
println!("字节数: {}", test_str.len());
println!("字符数: {}", test_str.chars().count());
assert!(
!validate_address(test_str),
"'北京'字符数是2,应该返回false"
);
assert!(!validate_address(&"a".repeat(101)), "长度101应该返回false");
assert!(
!validate_address("北京市@#$%朝阳区"),
"包含特殊字符应该返回false"
);
}
}