【问题标题】:How to negate this regex如何否定这个正则表达式
【发布时间】:2013-08-08 00:09:58
【问题描述】:

以下正则表达式将对文本框中输入的邮政信箱进行验证,

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

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

【问题讨论】:

  • 验证不是这样工作的。当然你想按原样使用正则表达式,然后如果输入的值不匹配,需求软件会通知。
  • 可能是 OP 想要排除包含邮政信箱的地址
  • 这仅适用于美国地址吗?
  • @OrangeDog 感谢您的快速回复,但它不适用于我在 demandware 平台上,“如果输入的值不匹配,则 demandware 会通知。”是正确的,但我不想让用户再输入邮政信箱
  • 您可能需要考虑使用不区分大小写的匹配,而不是所有那些大写/小写变体。这将大大简化模式。

标签: html regex


【解决方案1】:

我建议不要尝试使用正则表达式来做到这一点。击败1 太容易了方式。相反,您需要将问题外包给知道他们在做什么的人。在这种情况下,since you are dealing with US addresses onlyUSPS

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

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

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

2:但不是消除。

【讨论】:

  • 是的,我已经向我的客户指出了这一点,即使我可以通过某种组合来击败它,但是如果我想展示一些解决方法,你可以提出一些建议
  • @user2408578:不,我认为使用正则表达式是错误的方法。
【解决方案2】:

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

在这种情况下

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

供参考:

Regex lookarounds

【讨论】:

  • 大概正则表达式是针对整个值进行测试的。此正则表达式将验证它不开始与邮政信箱,而不是值不包含一个。
  • @streetpc 是的,你是对的,你可以在regular-expressions.info/javascriptexample.html 上快速验证它,帮助我
【解决方案3】:

你可以使用这个模式:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 嗯,这是我正在使用但无法正常工作的内容,或者您​​可以查看 www.regular-expressions.info/javascriptexample.html,
    • 是的,我忘记了^,已修复。
    • 另外,由于[.\s-]+ 中的+[Oo] 之前,它将允许"PO Box"。要解决此问题,您只需将 + 替换为 *^(?!.*?\b[Pp](OST|ost)?[.\s-]*[Oo](FFICE|ffice)?[.\s-]+[Bb](OX|ox)\b)
    猜你喜欢
    • 1970-01-01
    • 2011-02-07
    • 2013-01-18
    • 1970-01-01
    • 2010-10-04
    • 2021-05-21
    • 2019-04-10
    • 1970-01-01
    相关资源
    最近更新 更多