JavaScript 的街道地址正则表达式

Street address regex for JavaScript

本次测试的规则是:

  1. 必须包含字母和数字
  2. 可能在字符串中的任何位置包含这些特殊字符:
Number sign (#)
Minus (-)
Full stop (.)
Slash (/)
Space ( )
  1. 可以包含任何其他特殊字符
  2. 可能只包含字母
  3. 可以只包含字母and/or特殊字符
  4. 可能只包含数字
  5. 可能只包含数字and/or特殊字符
  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 下面的答案非常接近,但在我最初的问题中我没有指定 spaces 是特殊字符的一部分:

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

我已经尝试自己加入 space 特殊字符,但没有得到想要的结果。

查看实例。 Live Example

听起来您正在尝试验证给定字符串是否与一组密码规则匹配,对吧?我建议您不要使用单个正则表达式。这是我用 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 行也没关系。

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

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

解释:

  • ^ - 字符串开头
  • (?=.*[A-Za-z]) - 至少一个 alpa 字符的正面前瞻
  • (?=.*\d) - 至少一个数字字符的正面前瞻
  • (?!.*[^A-Za-z0-9\-#\.\/]) - 对任何不允许的字符进行否定前瞻

您可以使用一种模式来查找所有有效字符,直到字符串结束:

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

根据更新的要求进行更新以允许 spaces:

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

解释:只需在否定字符class

后加一个space

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

/^(?=.*[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);
});