【问题标题】:Detecting PO box with Regex missing one match检测带有正则表达式的邮政信箱缺少一个匹配项
【发布时间】:2020-10-02 17:06:03
【问题描述】:

这是我当前用于将邮政信箱检测为地址的表达式:

^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s+(B(IN|OX))?)|B(IN|OX))

它匹配我需要的所有内容,除了 POBoxP.O.Box(B 之前没有空格)。如何调整我的表达以包含它?

测试链接:https://regex101.com/r/vKDiWW/1

【问题讨论】:

  • 你想匹配哪些字符串?因为这个正则表达式永远不会是正确的。 (捕获9组,POST. OFFICE. BIN&P OFF. 有效等)

标签: php regex


【解决方案1】:

我假设你的意思是匹配文字点而不匹配任何非换行符——所以现在你会看到模式中的点被转义了。

我移动了模式中的点以了解您所需的逻辑,并且我还删除了一些不需要的括号。有关说明,请参阅我的内联 cmets。

图案:

~^\s*(P(\.|OST)?\s*(O(\.|FF(ICE)?)?)?\s*(B(IN|OX))?|B(IN|OX))~i

正则表达式 (Demo)

^
\s*
(
  P(\.|OST)?              #P or P. or POST
  \s*
  (O(\.|FF(ICE)?)?)?      #nothing or O or O. or OFF or OFFICE
  \s*
  (B(IN|OX))?             #nothing or BIN or BOX
  |
  B(IN|OX)
)

忽略所有可选空格和不区分大小写,上述模式将匹配以下 45 个:

BIN
BOX
P
PBIN
PBOX
PO
POBIN
POBOX
PO.
PO.BIN
PO.BOX
POFF
POFFBIN
POFFBOX
POFFICE
POFFICEBIN
POFFICEBOX
P.
P.O
P.OBIN
P.OBOX
P.O.
P.O.BIN
P.O.BOX
P.OFF
P.OFFBIN
P.OFFBOX
P.OFFICE
P.OFFICEBIN
P.OFFICEBOX
POST
POSTBIN
POSTBOX
POSTO
POSTOBIN
POSTOBOX
POSTO.
POSTO.BIN
POSTO.BOX
POSTOFF
POSTOFFBIN
POSTOFFBOX
POSTOFFICE
POSTOFFICEBIN
POSTOFFICEBOX

【讨论】:

    【解决方案2】:

    B 之前没有空格的地方

    对,您的表达式包含\s+,并且此模式需要一个或多个空格。

    使用\s*[[:space:]]*

    ^\s*((P(OST)?.?\s*(O(FF(ICE)?)?)?.?\s*(B(IN|OX))?)|B(IN|OX))
    

    proof

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-06
      • 2021-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多