0

以下正则表达式将对在文本框中输入的 PO Box 进行验证,

\b[P|p](OST|ost)?[.\s-]+[O|o](FFICE|ffice)?[.\s-]+[B|b](OX|ox)\b

我想否定这一点,以检测用户是否没有在文本框中输入 PO Box,我知道我们也可以使用 javascript 来做到这一点,但我的平台有不同的表单结构,它的需求软件表单,我有正则表达式作为字段属性。我们可以在这个字段中提交一个正则表达式,它会自动验证它。知道吗?

4

4 回答 4

3

我建议不要尝试使用正则表达式来执行此操作。打败1太容易。相反,您需要将问题外包给知道他们在做什么的人。在这种情况下,由于您只处理美国地址,因此USPS

因此,您应该使用USPS 地址标准化/验证 API。您可以提交一个地址,它会返回给您该地址的“清理”版本。它会告诉你地址是否有效。而如果是邮政信箱,它会以标准化的格式返回给你,现在你不需要一个可以被打败的正则表达式,现在你只需要一个简单的字符串匹配。而且,作为额外的财富,您将获得一个标准化经过验证的收货地址表示,从而减少2出错的可能性。

我承认我在回避您的实际工程问题。但工程的一部分正在放弃那些错误的解决方案。您需要验证地址。因此,请验证地址,而不是尝试构建一个状态机,该状态机可以检测一些代表邮政信箱的输入,但在其他输入上会失败。USPS提供验证服务,他们这里的权威专家。

1 : 我并不是说你会面对对手,只是你会面对人们输入地址时所采用的所有创造性、草率、懒惰的方式。

2:但不排除。

于 2013-08-07T13:21:50.647 回答
0

如果正则表达式风格是 JavaScript 的,那么您可以使用否定前瞻

^(?!.*?\b[Pp](OST|ost)?[.\s-]+[Oo](FFICE|ffice)?[.\s-]+[Bb](OX|ox)\b)
于 2013-08-07T13:03:41.967 回答
0

您需要使用否定环视: (?!pattern).

在这种情况下

 (?! \b[P|p](OST|ost)?[.\s-]+[O|o](FFICE|ffice)?[.\s-]+[B|b](OX|ox)\b )

以供参考:

正则表达式环顾四周

于 2013-08-07T13:03:08.073 回答
0

您可以使用此模式:

^(?:[^p]+|\Bp+|p(?!(?:ost)?[.\s-]+o(?:ffice)?[.\s-]+box\b))+$

这个想法是只测试以“p”开头的子字符串(以获得更多性能)。要使此检查不区分大小写,您可以(?i)在模式的开头添加:

^(?i)(?:[^p]+|\Bp+|p(?!(?:ost)?[.\s-]+o(?:ffice)?[.\s-]+box\b))+$
于 2013-08-07T13:49:28.847 回答