JavaScript 的街道地址正则表达式
Street address regex for JavaScript
本次测试的规则是:
- 必须包含字母和数字
- 可能在字符串中的任何位置包含这些特殊字符:
Number sign (#)
Minus (-)
Full stop (.)
Slash (/)
Space ( )
- 可以不包含任何其他特殊字符
- 可能不只包含字母
- 可以不只包含字母and/or特殊字符
- 可能不只包含数字
- 可能不只包含数字and/or特殊字符
- 数字、字母和特殊字符可以任意排列
所需匹配示例:
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);
});
本次测试的规则是:
- 必须包含字母和数字
- 可能在字符串中的任何位置包含这些特殊字符:
Number sign (#)
Minus (-)
Full stop (.)
Slash (/)
Space ( )
- 可以不包含任何其他特殊字符
- 可能不只包含字母
- 可以不只包含字母and/or特殊字符
- 可能不只包含数字
- 可能不只包含数字and/or特殊字符
- 数字、字母和特殊字符可以任意排列
所需匹配示例:
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);
});