以下正则表达式将对在文本框中输入的 PO Box 进行验证,
\b[P|p](OST|ost)?[.\s-]+[O|o](FFICE|ffice)?[.\s-]+[B|b](OX|ox)\b
我想否定这一点,以检测用户是否没有在文本框中输入 PO Box,我知道我们也可以使用 javascript 来做到这一点,但我的平台有不同的表单结构,它的需求软件表单,我有正则表达式作为字段属性。我们可以在这个字段中提交一个正则表达式,它会自动验证它。知道吗?
我建议不要尝试使用正则表达式来执行此操作。打败1太容易了。相反,您需要将问题外包给知道他们在做什么的人。在这种情况下,由于您只处理美国地址,因此USPS。
因此,您应该使用USPS 地址标准化/验证 API。您可以提交一个地址,它会返回给您该地址的“清理”版本。它会告诉你地址是否有效。而如果是邮政信箱,它会以标准化的格式返回给你,现在你不需要一个可以被打败的正则表达式,现在你只需要一个简单的字符串匹配。而且,作为额外的财富,您将获得一个标准化且经过验证的收货地址表示,从而减少2出错的可能性。
我承认我在回避您的实际工程问题。但工程的一部分正在放弃那些错误的解决方案。您需要验证地址。因此,请验证地址,而不是尝试构建一个状态机,该状态机可以检测一些代表邮政信箱的输入,但在其他输入上会失败。USPS提供验证服务,他们是这里的权威专家。
1 : 我并不是说你会面对对手,只是你会面对人们输入地址时所采用的所有创造性、草率、懒惰的方式。
2:但不排除。
如果正则表达式风格是 JavaScript 的,那么您可以使用否定前瞻:
^(?!.*?\b[Pp](OST|ost)?[.\s-]+[Oo](FFICE|ffice)?[.\s-]+[Bb](OX|ox)\b)
您需要使用否定环视: (?!pattern)
.
在这种情况下
(?! \b[P|p](OST|ost)?[.\s-]+[O|o](FFICE|ffice)?[.\s-]+[B|b](OX|ox)\b )
以供参考:
您可以使用此模式:
^(?:[^p]+|\Bp+|p(?!(?:ost)?[.\s-]+o(?:ffice)?[.\s-]+box\b))+$
这个想法是只测试以“p”开头的子字符串(以获得更多性能)。要使此检查不区分大小写,您可以(?i)
在模式的开头添加:
^(?i)(?:[^p]+|\Bp+|p(?!(?:ost)?[.\s-]+o(?:ffice)?[.\s-]+box\b))+$