如何否定这个正则表达式

时间:2013-08-07 12:58:37

标签: html regex

以下正则表达式将对P. O.框进行验证。在文本框中输入

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

我想否定这一点,以便检测用户是否没有在文本框中输入P. O. Box it, 我知道我们也可以通过使用javascript来实现,但我的平台有不同的表单结构,它的需求软件形式,我有正则表达式作为字段属性。 我们可以在这个领域提交一个正则表达式,它会自动验证它。任何想法?

4 个答案:

答案 0 :(得分:3)

我建议尝试使用正则表达式执行此操作。 方式太容易打败 1 。相反,您需要将问题提供给知道自己在做什么的人。在这种情况下,since you are dealing with US addresses onlyUSPS

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

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

1 :我不是说你会面对对手,只是你会面对人们进入地址的所有创造性,草率和懒惰的方式。

2 :但不是消除。

答案 1 :(得分:0)

您需要使用否定的外观:(?!pattern)

在这种情况下

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

供参考:

Regex lookarounds

答案 2 :(得分:0)

如果正则表达式是JavaScript,那么您可以使用negative look-ahead

^(?!.*?\b[Pp](OST|ost)?[.\s-]+[Oo](FFICE|ffice)?[.\s-]+[Bb](OX|ox)\b)

答案 3 :(得分:0)

您可以使用此模式:

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

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

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