JavaScript 的街道地址正则表达式

问题描述

本次测试的规则是:

  1. 必须包含字母和数字
  2. 可以在字符串中的任何位置包含这些特殊字符:
Number sign (#)
Minus (-)
Full stop (.)
Slash (/)
Space ( )
  1. 可以包含任何其他特殊字符
  2. 可以不能仅由字母组成
  3. 可以仅由字母和/或特殊字符组成
  4. 可能不能仅由数字组成
  5. 可以仅由数字和/或特殊字符组成
  6. 数字、字母和特殊字符的顺序可以任意

所需匹配的示例:

445b
apt 445a
Apt. #445
Apt 445
Apt-445
Apt - 445
apt445
apt#445
apt/445
APT-445a
APT - 445c
Apt# 445b
Apt. #445-c
22 Elm St.

不匹配的示例:

apt four forty five
Elm St.
Elm St
Elm Street
445
445 445
445-445
#445
(any or all of the special characters by themselves)

41686d6564's 下面的答案非常接近,但在我最初的问题中,我没有指定空格是特殊字符的一部分:

/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9\-#\.\/]+$/

我自己尝试将空格特殊字符合并,但没有得到想要的结果。

查看现场示例。 Live Example

解决方法

此正则表达式验证您的规则:

/^(?=.*[A-Za-z])(?=.*\d)(?!.*[^A-Za-z0-9\-#\.\/])/

说明:

  • ^ - 字符串的开始
  • (?=.*[A-Za-z]) - 至少一个 alpa char 的正向预测
  • (?=.*\d) - 至少一位字符的正向预测
  • (?!.*[^A-Za-z0-9\-#\.\/]) - 任何不允许的字符的负前瞻

代替双重否定,您可以使用模式查找所有有效字符直到字符串结束:

/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9\-#\.\/]*$/

更新基于允许空格的更新要求:

/^(?=.*[A-Za-z])(?=.*\d)(?!.*[^A-Za-z0-9\-#\.\/ ])/

说明:只需在否定字符类中添加一个空格

或者,查找所有有效字符,包括空格:

/^(?=.*[A-Za-z])(?=.*\d)[A-Za-z0-9\-#\.\/ ]*$/

更新,带有 JavaScript 测试:

const tests = `445b
apt 445a
Apt. #445
Apt 445
Apt-445
Apt - 445
apt445
apt#445
apt/445
APT-445a
APT - 445c
Apt# 445b
Apt. #445-c
22 Elm St.
apt four forty five
Elm St.
Elm St
Elm Street
445
445 445
445-445
#445`;
var regex = /^(?=.*[A-Za-z])(?=.*\d)(?!.*[^A-Za-z0-9\-#\.\/ ])/;
tests.split(/[\r\n]+/).forEach((str) => {
  result = regex.test(str);
  console.log(str + ' ==> ' + result);
});

,

听起来您正在尝试验证给定的字符串是否与一组密码规则匹配,对吗?我建议您不要使用单个正则表达式。下面是我将如何用 Perl 编写它,但这应该适用于任何语言:

# Must be all letters,digits or some punctuation.
if ( $str =~ /^[-#./A-Za-z0-9]+$/ ) {
    $ok = 1;
}
else {
    $ok = 0;
}

# If it is entirely letters,it is bad.
if ( $str =~ /^[A-Za-z]+$/ ) {
    $ok = 0;
}

# If it is entirely digits,it is bad.
if ( $str =~ /^[0-9]+$/ ) {
    $ok = 0;
}

这涵盖了您的所有规则。与匹配一个难以阅读的正则表达式相比,它的代码行数更多,但对您来说更容易理解,也更容易在未来进行修改。

您要将其包装在一个名为 is_password_valid 之类的函数中,因此它是否占用 20 行也无关紧要。