【问题标题】:Street address regex for JavaScriptJavaScript 的街道地址正则表达式
【发布时间】:2021-02-11 21:59:07
【问题描述】:

这个测试的规则是:

  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\-#.\/]+$(@ 987654323@)。如果这不是你需要的,你应该edit这个问题并澄清规则。

标签: javascript regex street-address


【解决方案1】:

这个正则表达式验证你的规则:

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

【讨论】:

  • 彼得,我更新了问题,因为我忘记指定“空格”是允许的特殊字符的一部分。这对您的回答有何影响?您回答的第二部分是我目前所拥有的。当我将 \s 添加到最后一部分时,它基本上允许几乎任何东西通过。
  • 我添加了一个 JavaScript 代码 sn-p,现在你声明你使用 JavaScript。今后,请详细说明您的问题,以便我们提供更好的帮助。
  • 我很抱歉。我是在这里提问的新手,我花了一分钟才把问题弄得恰到好处。感谢您的详尽回复!
【解决方案2】:

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

【讨论】:

  • 谢谢安迪,我非常感谢。实际上这是一个地址字段,规则来自我公司的另一个部门。该表格是半内部表格,因此它不是真正面向公众的。我正在验证 JS 中的字段,但我绝对可以采用你的 Perl 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 2013-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多